这是一个非常基本的JavaScript问题:
定义函数后:
function a(){
alert("A!");
return function(){
alert("B!")
};
}
如果我调用该函数:
a();
只有“A!”很警觉; 但是,如果我重新创建一个新功能:
var newFunc = a();
newFunc();
两者都是“A!”和“B!”警报。
有人可以解释原因吗? 百万THX !!
这是从p78,面向对象的JavaScript,Stoyan Stefanov,PACKT PUBLISHING
中提取的答案 0 :(得分:4)
调用以下内容将执行两个警报:
a()();
您的函数a
正在执行,并返回一个函数。但是你没有执行返回的函数。
在你的第二个例子中,这正是你正在做的事情,但是分成两行(因此你的代码中有两个()
)。
答案 1 :(得分:1)
这很简单:
function a()
{
alert("A!");
return function()
{
alert("B!");
};
}
a();
在这种情况下,您调用a
,其功能正文提醒A!
,然后返回一个函数。返回值(插入B的函数)完全被忽略。
写作时
var newF = a();
newF();
返回的函数被分配给newF
,如果你调用该函数,那么,通过这个变量,你可以提醒B.要一次性完成所有操作,你可以轻松地写下:
(a())();
答案 2 :(得分:0)
返回值就是 - return 值。它没有被执行。
试试这个很有趣:
a = a();
a();
答案 3 :(得分:0)
在第一次调用a();你正在调用该函数,它返回另一个函数。但你不称它为 在第二个示例中,您调用函数并将返回值(它返回的函数)存储在变量中,然后调用它,这将调用返回的函数。
function a() {
alert("A!"); //This will be called when the function a is called.
//After the alert another function is returned:
return function(){
//and if this function is called, it will:
alert("B!");
}
}
a(); //Calls a, but do nothing with return value.
a()(); //Calls a and directly calls the return value after.
var b = a(); //Calls a and stores return value in variable 'b'
b(); //calls 'b', which is the return value of 'a'.
答案 4 :(得分:0)
应该是相当明显的。
不执行函数的返回值,而是返回。返回陈述之前的任何内容当然都会被执行。
基本上,代码:var newFunc = a();
将函数a()
(在本例中为匿名函数)的返回值赋给newFunc
。因此,调用newFunc()
将执行返回的匿名函数。
您可以使用var newFunc = a()();
强制返回的函数在赋值时运行,newFunc
将匿名函数的返回值分配给null
(在本例中为{{1}},并且警报正在运行)。
答案 5 :(得分:0)
您的第一个示例a()
执行a
函数,该函数执行警报函数并返回函数b
(但不执行它)。
第二个示例var newFunc = a()
执行a
,并将其值保存到变量newFunc
,这意味着它现在等于b
。然后执行newFunc,它会发出'B!'警告。
答案 6 :(得分:0)
调用时,a会做两件事:
您的第一个示例a()
是对a
的调用,因此它会警告“A!”,创建一个警告“B!”的函数。当被调用时返回该函数并将其丢弃(因为未使用返回的值)。
你的第二个例子var newFunc = a()
与第一个例子类似:它是对a
的调用,警告'A!',创建一个警告'B!'的(另一个)函数,返回函数和返回值分配给newFunc
。现在newFunc
是对提醒'B!'的函数的引用。
最后,代码的最后一行newFunc();
调用警告“B!”的函数。
答案 7 :(得分:0)
当你这样做时:
var newFunc = a();
执行一个执行,所以“A!”警报,并将返回值赋值给变量newFunc:
newfunc = function(){
alert("B!");
}
所以当你执行newfunc时,“B!”警报。