-1

JavaScript コードの実行が理解できません。関数 greeting の後、最初の 2 つの関数宣言が実行されます。

function greet(myName) {
    var myAlertString = "Hello " + myName ; // Local variable
    function doAlert() {
        alert(myAlertString);
    }
    doAlert();
}

greet("Smak"); // will alert "Hello Smak"    

var greetSam = greet("Sam"); // greetKitty is now a function
greetSam(); // will alert "Hello Sam"

var greetKitty = greet("Kitty"); // greetKitty is now a function
greetKitty(); // will alert "Hello Kitty"

var greetMax = greet("Max"); // greetMax is now a function
greetMax(); // will alert "Hello Max"

greetKitty(); // will alert "Hello Kitty"

キティとマックスのポップアップが表示されないのはなぜですか?

私は正しい答えを得ました: http://jsfiddle.net/QHN6T/13/

4

3 に答える 3

5

割り当ての 1 つにエラーがあります。つまり、次のとおりです。

var greetSam = greet("Sam"); // greetKitty is now a function

あなたの仮定は間違っています。greetSamを返さずfunction、 を返しますundefinedgreetSam()したがって、さらに下の行を呼び出すと、 TypeError: greetSam is not a function.

正しく書かれています:

...
    doAlert();
    return doAlert;
}
于 2013-09-01T07:50:55.353 に答える
4

問題は、次の行です。

var greetSam = greet("Sam"); // greetKitty is now a function

関数を返しません。を呼び出した結果alert()、つまり が返されますundefined。次の行:

greetSam(); // will alert "Hello Sam"

エラーを生成し、スクリプトを停止します。

の代わりにgreetreturnに変更すると、関数が返されます。残念ながら、最初の呼び出し:doAlertdoAlert()

greet("Smak");

は、 のアラートを生成しなくなり"Smak"ます。あなたは書く必要があります:

greet("Smak")();
于 2013-09-01T07:50:46.713 に答える
1

簡単な答えは、交換する必要があるということです

return doAlert();

return doAlert;。2 つの違いは、最初のバージョンは戻りdoAlert値を返すのに対して、2 番目のバージョンは後で呼び出すことができる関数(いわゆるクロージャー) を返すことです。これは意図したとおりです。実行順序とは関係ありません。

于 2013-09-01T07:52:20.500 に答える