我不明白以下javascript代码的重要性:
var func = f()
func()
有人能负担得起向我解释一下吗?当然,我不是javascript的专家。 我在网上找到的完整代码是:
var a = 1
function f() {
function g() {
alert(a)
}
return g
}
var func = f()
func() // 1
它试图说明封闭,词汇环境。任何帮助表示赞赏。我在http://javascript.info/tutorial/closures
上找到了它答案 0 :(得分:1)
function f()
声明一个函数。这只是意味着您可以稍后调用它,但代码本身不会执行。
var func = f()
调用函数f
,并将其结果赋给变量func
。自f
returns g
起,func等于g
(触发警报)。
最后,func()
调用分配给它的函数,并显示警告。
这里需要注意的重要一点是声明和函数调用之间的区别。 func
本身只是一个赋值函数的变量,其中func()
实际运行该函数。如果它有帮助,你可以认为func
是函数的“指针”(尽管事实并非如此)。正如其他人所指出的那样,这并不是闭包的最佳例子,更多的是函数是Javascript中的对象。
答案 1 :(得分:1)
对f()
的调用会返回函数g
,并将其分配给变量func
。
然后,呼叫func()
执行g()
,显示警报消息。
答案 2 :(得分:0)
实际上,这并不是说明结束的最好例子。它只是没有创造它。
为了在这种情况下适当地说明闭包,代码应该如下:
function f() {
var a = 1
function g() {
alert(a)
}
return g
}
var func = f();
func() // 1
所以关键是,当函数f
被执行时,它返回函数g
,它包含对被调用函数f
的执行上下文的引用(它包含所有的变量,在函数内部声明,传递参数,范围链等)。通常在执行垃圾收集器之后应该从内存中删除执行上下文,但返回的函数g
保存对它的引用,因此它不会被删除。
当调用函数func
时,它从所谓的闭包中访问变量a
并提醒它,但是没有其他方法可以再访问这个变量。
如果你不太了解那里发生了什么,我建议你阅读this article。它已经很老了,但是非常详细地解释了这个主题。
我最近发现的另一个good one更容易理解,所以你可以从它开始,然后回到我提到的第一个。
希望这有点帮助。