3

なぜこれがうまくいくのか誰でも説明できますか:

var sayHello = function (name) {
   alert("Hello there " + name + "!");
}("Mike");

これはしませんが:

function sayHello (name) {
   alert("Hello there " + name + "!");
}("Mike");

マイク・ピート

4

6 に答える 6

4

あなたの2番目のコードは実際には次のとおりです。

function sayHello (name) {
   alert("Hello there " + name + "!");
}

("Mike");

したがって、最初に関数「sayHello」を宣言し、次に「ステートメント」を実行しています。

("Mike");

何もしません。

于 2009-08-19T10:52:50.247 に答える
3

これはうまくいきます:

    (function sayHello (name) {
        alert("Hello there " + name + "!");
     })("Mike");

関数自体を囲む括弧に注意してください。関数名「sayHello」を削除することもできますが、引き続き機能します。どこまで?私は前向きではありません。おそらく、それを変数に割り当て、ラッピング () を使用しないことで、実際にはそれを sayHello に割り当ててから、無名関数ではなく、say hello を実行していることになります。

于 2009-08-19T10:57:03.983 に答える
1
var sayHello = function (name) {
   alert("Hello there " + name + "!");
}("Mike");

これにより、匿名関数が作成され、「Mike」パラメーターを使用してすぐに呼び出されます。次に、その関数呼び出しの戻り値が変数に割り当てられますsayHello

function sayHello (name) {
   alert("Hello there " + name + "!");
}("Mike");

これは、名前を持つ通常の関数を定義するだけsayHelloで、関数ステートメントは終了の } の後に終了します。次に、有効な ("Mike") ステートメントが続きますが、何もしません。

于 2009-08-19T10:59:45.087 に答える
0

私の回答が元の投稿を誤って読んだため、編集されました:

関数がラムダ関数として値に割り当てられなくなったため、呼び出しを呼び出す値がないため、後で ("Mike") を使用して関数を呼び出しても機能しません。他の人が提案したように、これを括弧で囲んで一時変数を作成しても、匿名関数を呼び出すことができます。

(function sayHello (name) {
   alert("Hello there " + name + "!");
})('Mike');
于 2009-08-19T10:49:00.083 に答える
0

関数定義を呼び出す前に関数定義を囲むと、次の()ようになります。

(function sayHello(name) {
   alert("Hello there " + name + "!");
})("Mike");

// however -- 
alert(typeof sayHello);  // undefined

したがって、そのようなことをしたい場合は、無名関数にすることもできます。

(function(name) {
   alert("Hello there " + name + "!");
})("Mike");

そして、それが必要かどうかはわかりませんが、安全のために、そのようなクロージャーを使用しているときはいつでも、常にラップします()

于 2009-08-19T10:58:18.350 に答える