4

関数リテラルを宣言すると:

var x = function(){
        alert('hi');
    };
    console.log(x); // returns the function code.

でも:

var x = (function(){
    alert('hi');
})();

console.log(x); // returns undefined?

なぜこれが起こるのかわかりません。関数をリテラルとして記述するポイントは、変数参照名でアクセスできるようにすることではありませんか? ばかげているかもしれませんが、JavaScript を学習しているだけなので、あまり厳しく判断しないでください。

4

2 に答える 2

8

関数は何も返さないため、戻り値はundefinedです。

自己実行関数が実行され、関数はどこにも保存されません。戻り値のみが残ります (および関数が設定/変更する外部変数)。

たとえば、このコードは次と同等var x = 'hi';です。

var x = (function(){
    return 'hi';
})();

自己呼び出し関数の目的は通常、新しいスコープを作成することです。たとえば、ループ内でコールバック関数を作成する場合などです。

for(var i = 0; i < 5; i++) {
    window.setTimeout(function(){ alert('i = ' + i); }, 1000 * i);
}

これはすべてのコールバックで同じものを使用するiため、アラートがi = 55 回発生します。

for(var i = 0; i < 5; i++) {
    (function(i) {
        window.setTimeout(function(){ alert('i = ' + i); }, 1000 * i);
    })(i);
}

自己実行関数を使用して新しいスコープを作成しi、各ループで新しいスコープを作成します。

自己実行関数のもう 1 つの用途は、特定の変数が確実に使用可能になり、正しい値に設定される新しいスコープを作成することです。

(function($, window, undefined) {
    // here the following always applies:
    // $ === jQuery
    // window === the global object [assuming the function was executed in the global scope]
    // undefined is well, undefined - in some js engines someone could have redefined it
})(jQuery, this);
于 2012-05-30T14:36:20.930 に答える
5

もし、あんたが:

var foo = somefunction;

…次に、関数を に割り当てますfoo

もし、あんたが:

var foo = somefunction();

…次に、関数呼び出しの戻り値をfoo

あなたの機能:

function(){
    alert('hi');
}

… にはreturnステートメントがないため、 が返されundefinedます。

于 2012-05-30T14:37:48.963 に答える