JavaScript中的执行顺序

JavaScript中的执行顺序,javascript,Javascript,我无法理解JavaScript代码的执行。函数完成后,将执行前两个函数声明: function greet(myName) { var myAlertString = "Hello " + myName ; // Local variable function doAlert() { alert(myAlertString); } doAlert(); } greet("Smak"); // will alert "Hello Smak"

我无法理解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没有弹出窗口

我得到了正确的答案:
问题是这行:

var greetSam = greet("Sam"); // greetKitty is now a function
不返回函数。它返回调用未定义的警报的结果。下一行:

greetSam(); // will alert "Hello Sam"
生成错误并停止脚本

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

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

greet("Smak")();

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

var greetSam = greet("Sam"); // greetKitty is now a function
你的假设是错误的。greetSam不返回函数,它返回未定义的函数。因此,进一步向下调用greetSam会产生一个TypeError:greetSam不是一个函数

正确书写:

...
    doAlert();
    return doAlert;
}

简单的回答是你必须更换

返回多勒特


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

这是某种垃圾邮件还是您无法键入JSFIDLE?现在,greet调用其内部函数并返回其结果。它不返回函数。因此,greetSmak确实会立即发出警报,而你的进一步假设是错误的。在你的第一把小提琴中,报税表缺失。因此出现了错误。为什么在小提琴和此处有不同的代码?您可以使用浏览器的JavaScript/错误控制台轻松调试并查看错误,该控制台显示:Uncaught TypeError:undefined不是函数。@Subbrashisdas,您忘了删除小提琴中doAlert后面的括号。greet仍然没有返回函数。@Ted Hopp我做得正确,但为什么它不工作。“看,只有斯马克在工作,其他人不在。”弗雷德里克·哈米迪。请更新JSFIDLE,并请评论正确方法的链接。@SubhrashisDas,请再次阅读此答案和aefxx提供的另一个答案。试着理解他们所说的return doAlert与return doAlert的不同之处。然后将这些知识应用到您的代码中。@SubhrashisDas-我查看了您的JSFIDLE。第7行的代码应该由return-doAlert改为return-doAlert;返回多勒特;没有括号。之所以只看到Smak,是因为调用greetSmak时,它会生成警报,然后返回未定义的。因为第10行实际上是greetSmak;,第二个括号导致错误,因为undefined不是函数,脚本停止。换第七行,一切都会好起来的。这不是万能的。否则请更新JSFIDLE并给我解决方案。不,我不会摆弄你的小提琴。去摆弄你自己。@Frédéric Hamidi,我只想看到网页上所有的弹出窗口。请帮忙。@aefxx,谢谢2帮助我。