なぜこれがうまくいくのか誰でも説明できますか:
var sayHello = function (name) {
alert("Hello there " + name + "!");
}("Mike");
これはしませんが:
function sayHello (name) {
alert("Hello there " + name + "!");
}("Mike");
マイク・ピート
なぜこれがうまくいくのか誰でも説明できますか:
var sayHello = function (name) {
alert("Hello there " + name + "!");
}("Mike");
これはしませんが:
function sayHello (name) {
alert("Hello there " + name + "!");
}("Mike");
マイク・ピート
あなたの2番目のコードは実際には次のとおりです。
function sayHello (name) {
alert("Hello there " + name + "!");
}
("Mike");
したがって、最初に関数「sayHello」を宣言し、次に「ステートメント」を実行しています。
("Mike");
何もしません。
これはうまくいきます:
(function sayHello (name) {
alert("Hello there " + name + "!");
})("Mike");
関数自体を囲む括弧に注意してください。関数名「sayHello」を削除することもできますが、引き続き機能します。どこまで?私は前向きではありません。おそらく、それを変数に割り当て、ラッピング () を使用しないことで、実際にはそれを sayHello に割り当ててから、無名関数ではなく、say hello を実行していることになります。
var sayHello = function (name) {
alert("Hello there " + name + "!");
}("Mike");
これにより、匿名関数が作成され、「Mike」パラメーターを使用してすぐに呼び出されます。次に、その関数呼び出しの戻り値が変数に割り当てられますsayHello
。
function sayHello (name) {
alert("Hello there " + name + "!");
}("Mike");
これは、名前を持つ通常の関数を定義するだけsayHello
で、関数ステートメントは終了の } の後に終了します。次に、有効な ("Mike") ステートメントが続きますが、何もしません。
私の回答が元の投稿を誤って読んだため、編集されました:
関数がラムダ関数として値に割り当てられなくなったため、呼び出しを呼び出す値がないため、後で ("Mike") を使用して関数を呼び出しても機能しません。他の人が提案したように、これを括弧で囲んで一時変数を作成しても、匿名関数を呼び出すことができます。
(function sayHello (name) {
alert("Hello there " + name + "!");
})('Mike');
関数定義を呼び出す前に関数定義を囲むと、次の()
ようになります。
(function sayHello(name) {
alert("Hello there " + name + "!");
})("Mike");
// however --
alert(typeof sayHello); // undefined
したがって、そのようなことをしたい場合は、無名関数にすることもできます。
(function(name) {
alert("Hello there " + name + "!");
})("Mike");
そして、それが必要かどうかはわかりませんが、安全のために、そのようなクロージャーを使用しているときはいつでも、常にラップします()