我无法理解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/
答案 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
返回,而第二个版本返回可以稍后调用的函数(所谓的闭包 ),这是你的意图。它与执行顺序无关。