JavaScript中的执行顺序

Order of Execution in JavaScript

本文关键字:顺序 执行 JavaScript      更新时间:2023-09-26

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

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/

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

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

你的假设是错误的。greetSam不返回function,而是返回undefined。因此,进一步下行的线路上的呼叫greetSam()产生TypeError: greetSam is not a function

正确书写:

...
    doAlert();
    return doAlert;
}

问题是这行:

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

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

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

生成一个错误并停止脚本。

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

greet("Smak");

将不再为CCD_ 11生成警报。你必须写:

greet("Smak")();

简单的答案是你必须更换

return doAlert();

具有CCD_ 13。两者的区别在于,第一个版本返回doAlert返回的任何内容,而第二个版本返回稍后可以调用的函数(所谓的闭包),这正是您想要的。这与处决的顺序无关。