-1

我无法理解 JavaScript 代码的执行。在函数 greet 之后,执行前两个函数声明:

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"

为什么 Kitty 和 Max 没有弹出窗口?

我得到了正确答案:http: //jsfiddle.net/QHN6T/13/

4

3 回答 3

5

您的一项作业有误,即:

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

你的假设是错误的。greetSam不返回 a function,它返回undefined。因此,调用greetSam()更下方的行会产生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"

生成错误并停止脚本。

如果您更改greet为 returndoAlert而不是doAlert(),那么它将返回一个函数。不幸的是,然后第一个电话:

greet("Smak");

将不再为 生成警报"Smak"。你必须写:

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

简短的回答是你必须更换

return doAlert();

return doAlert;. 两者之间的区别在于,第一个版本返回任何doAlert返回值,而第二个版本返回一个可以稍后调用的函数(所谓的闭包),这正是您想要的。它与执行顺序无关。

于 2013-09-01T07:52:20.500 回答