为什么这段代码有效? - http://jsfiddle.net/Mq9Ap/1/
$(function() {
function outer() {
var counter = 0;
function inner() {
alert(counter);
counter++;
}
return inner;
}
var x = outer(); // As we're calling outer here, x is a reference to inner
x(); // alerts 0
x(); // alerts 1
});
但如果我将return inner
更改为return inner()
编辑:
我通过提及括号来混淆我的问题的意图。我仍然很困惑如何调用内部函数,因为x()只指向外部函数。
如果返回值是指向函数的指针,编译器是否知道它应该调用函数?
答案 0 :(得分:2)
return inner
返回内部函数。然后可以调用它。
return inner()
立即运行内部函数(警告0
),然后返回其返回值(未定义)。然后,您会收到undefined
不是函数的错误(当x()
尝试调用它时)。
答案 1 :(得分:0)
执行return inner();
时,实际上是在调用inner
并返回返回值,在本例中为undefined
,因为实际上没有返回任何内容。这将导致错误,因为undefined
不是函数(当您尝试通过x()
调用它时)。
执行return inner;
时,实际上是在返回对内部函数的引用。
答案 2 :(得分:0)
这是你返回的事实。
return inner();
实际调用内部函数并获得结果。该结果将被退回。由于inner
函数未显式返回任何内容,因此默认情况下它返回undefined
。现在x
未定义。您无法对未定义的x
进行调用。
return inner;
实际上返回对内部函数的引用。所以现在x
引用了一个函数。您可以执行实际调用x()
闭包函数的inner
。
答案 3 :(得分:0)
我想我已经破解了它;我的困惑并不是return inner;
,而是:
var x = outer();
我现在明白x保存外部的返回值,因为()调用是b
的函数引用,所以如果我们现在添加另一个()返回此返回value,然后调用引用的内部函数,类似于outer()();
function outer() {
var counter = 0;
function inner() {
console.log(counter);
counter++;
}
return inner;
}
outer()();
outer()();
outer()();
//output
0
0
0
var x = outer();
x();
x();
x();
//output
0
1
2
最后一部分var x
有效,因为外部已使用outer()
调用。当每次使用x();
调用内部时,计数器已经在堆栈上,因此内部函数将其视为静态变量...我假设。
混淆这个javascript :(
编辑:
另一个尤里卡时刻 - 我意识到outer()();
不起作用,因为每次调用第一个outer()
时,它都会创建一个新的函数上下文,并且每次都会初始化var counter
在堆栈上,当第二次调用被调用时,计数器将始终设置为零。
x = outer();
保留了之前函数调用的计数器值,因为函数上下文保存在x
中,var counter
仅初始化一次,因此它永远不会重置。< / p>