为什么我必须先将外部函数分配给变量才能调用它?
Why do I have to assign the external function to a variable before I can invoke it?
为什么这没有按预期工作?
function external() {
function internal() {
alert("external");
}
return internal;
}
external(); //nothing happens
var func = external();
func(); // alert pops up
这与它是一个闭包这一事实有关吗?因为这里它的工作方式与我预期的一样:
function test() {
alert("test");
}
test(); //alert pops up without assigning the function to a variable
就像@thefourtheye 在我刚刚做的时候建议的那样
external();
仅返回内部函数对象。
我刚刚添加了一个示例以使其更清楚!
function external() {
alert("foo");
function internal() {
alert("bar");
}
return internal;
}
external(); //returns foo (and the internel function)
external()(); //return foo and then bar
当你return internal
时,它正在返回一个函数。该函数未执行,仅作为引用传递回外部函数的调用者。所以 external()
基本上计算为未执行的函数表达式。它实际上等同于写作:
function() {
alert("external");
}
没有任何反应,因为该功能只是简单地表达但从未执行过。
相反,对于var func = external();
,函数表达式赋值给变量func
。实际上,它等同于这样写:
var func = function() {
alert("external");
}
这就是为什么当您随后执行 func()
时,弹出警报。
为什么这没有按预期工作?
function external() {
function internal() {
alert("external");
}
return internal;
}
external(); //nothing happens
var func = external();
func(); // alert pops up
这与它是一个闭包这一事实有关吗?因为这里它的工作方式与我预期的一样:
function test() {
alert("test");
}
test(); //alert pops up without assigning the function to a variable
就像@thefourtheye 在我刚刚做的时候建议的那样
external();
仅返回内部函数对象。
我刚刚添加了一个示例以使其更清楚!
function external() {
alert("foo");
function internal() {
alert("bar");
}
return internal;
}
external(); //returns foo (and the internel function)
external()(); //return foo and then bar
当你return internal
时,它正在返回一个函数。该函数未执行,仅作为引用传递回外部函数的调用者。所以 external()
基本上计算为未执行的函数表达式。它实际上等同于写作:
function() {
alert("external");
}
没有任何反应,因为该功能只是简单地表达但从未执行过。
相反,对于var func = external();
,函数表达式赋值给变量func
。实际上,它等同于这样写:
var func = function() {
alert("external");
}
这就是为什么当您随后执行 func()
时,弹出警报。