Javascript 为什么调用此函数?
为什么这个代码可以工作 但是,如果我将Javascript 为什么调用此函数?,javascript,function,Javascript,Function,为什么这个代码可以工作 但是,如果我将returninner更改为returninner() 编辑: 我提到了括号,混淆了我问题的意图。我仍然不知道如何调用内部函数,因为x()只指向外部函数 如果返回值是指向函数的指针,编译器是否知道它应该调用函数?returninner返回内部函数。这样就可以称之为 return inner()立即运行内部函数(警告0),然后返回其返回值(未定义)。然后,您会得到一个错误,undefined不是函数(当x()尝试调用它时)。当您执行返回内部()时,实际上是调用
returninner
更改为returninner()
编辑:
我提到了括号,混淆了我问题的意图。我仍然不知道如何调用内部函数,因为x()只指向外部函数
如果返回值是指向函数的指针,编译器是否知道它应该调用函数?
returninner
返回内部函数。这样就可以称之为
return inner()
立即运行内部函数(警告0
),然后返回其返回值(未定义)。然后,您会得到一个错误,undefined
不是函数(当x()
尝试调用它时)。当您执行返回内部()时
,实际上是调用内部
并返回返回值,在本例中,返回值为未定义
,因为实际上没有返回任何内容。这将导致错误,因为undefined
不是函数(当您尝试通过执行x()
调用它时)
当您执行
返回内部时代码>,实际上是返回对内部函数的引用。这是返回内容的事实
返回内部()代码>实际调用内部函数并获得结果。将返回该结果。由于内部
函数不显式返回任何内容,因此默认情况下它返回未定义的
。现在x
未定义。您不能在未定义的x
上进行调用
返回内部代码>实际返回对内部函数的引用。现在x
是对函数的引用。您可以执行x()
,它实际上会调用内部的
闭包函数。我想我已经破解了它;我的困惑不是太多的returninner代码>但它是:
var x = outer();
我现在了解到,x持有outer的返回值是因为()调用,它是对b
的函数引用,因此如果我们现在在这个返回值周围添加另一个(),它就会调用被引用的内部函数,类似于outer()
最后一节var x
之所以有效,是因为使用outer()
调用了outer。然后用x()调用内部时每次,计数器都已经在堆栈上,因此内部函数将其视为静态变量…我猜
让人困惑的是,这个javascript:(
编辑:
另一个妙不可言的时刻——我意识到outer()();
不起作用,因为每次调用第一个outer()
时,它都会创建一个新的函数上下文,并且每次在堆栈上初始化var计数器
,当调用第二个调用时,计数器总是设置为零
x=outer()
保留以前函数调用的计数器值,因为函数上下文保存在x
中,var counter
只初始化了一次,所以它永远不会重置。直到您的注释的最后一位,我仍然感到困惑;您是说编译器知道如果变量是poin,它应该自动调用吗当另一个函数遇到返回语句时,它将被调用?更新了我的答案。当你返回函数引用时,它将不会被调用。谢谢你的回答;请允许我在回答我自己的问题时,询问你是否能感觉到检查我的逻辑。我重视你的反馈,谢谢。
var x = 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