1

私はこの議論についてたくさんのページを読みましたが、それでもなぜこれ(宣言)が理解できません

function foo() {console.log("foo");}

(function(){
  // Really there is nothing here
})();

これ(式)の間、何もしません

var foo = function() {console.log("foo");}

(function(){
  // Really there is nothing here
})();

出力

foo

Uncaught TypeError:undefinedは関数ではありません

何が起こっているのか、ここにあるのか?

4

2 に答える 2

2

Felix Klingが指摘したように、割り当て後にセミコロンが欠落しています。

2番目の無名関数を囲む括弧は、関数呼び出しのパラメーターを囲む括弧として解釈されます。

var foo = function() {console.log("foo");}(function(){ })();

最初の関数にはreturnステートメントがないため、式function() {console.log("foo");}(function(){ })は戻ります。undefined括弧の最後のペアはそれを別の関数呼び出しにしundefinedますが、関数ではないので、その特定のエラーメッセージが表示されます。

于 2012-08-27T14:22:34.260 に答える
1

これは、セミコロンがオプションであってはならない理由です。空白は、読みやすくするためだけにあります。コード:

var foo = function() {console.log("foo");}

(function(){
    // Really there is nothing here
})();

このように見えます

var foo = function() {console.log("foo");}(function(){})();

名前付き関数呼び出しのように見せます

myFunction(function(){})();

また

myFunction("some code")();

最初の関数myFunction("some code")は未定義を返し、それよりもその関数を実行しようとします。

~undefined~();

だからそこに戻ってきた。

var foo = function() {console.log("foo"); return undefined;}(function(){})();

関数を返した場合、コードは正常に実行されます

var foo = function() {console.log("foo"); return arguments[0];}(function(){return "hello"})();
于 2012-08-27T14:23:56.097 に答える