JavaScript中的执行顺序

时间:2013-09-01 07:45:18

标签: javascript

我无法理解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/

3 个答案:

答案 0 :(得分:5)

您的某个作业出现错误,即:

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

你的假设是错误的。 greetSam未返回function,它会返回undefined。因此,调用greetSam()向下一行会产生TypeError: greetSam is not a function

正确撰写:

...
    doAlert();
    return doAlert;
}

答案 1 :(得分:4)

问题是这一行:

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

返回一个函数。它返回调用alert()的结果,即undefined。下一行:

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

生成错误并停止脚本。

如果您将greet更改为doAlert而不是doAlert(),则会返回一个函数。不幸的是,第一个电话:

greet("Smak");

将不再为"Smak"生成提醒。你必须写:

greet("Smak")();

答案 2 :(得分:1)

简短的回答是你必须更换

return doAlert();

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