2

我不明白以下 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上找到了它

4

3 回答 3

1
  1. function f()声明一个函数。这只是意味着您可以稍后调用它,但代码本身不会执行。

  2. var func = f()调用函数f,并将其结果分配给变量func。由于f returns g, func 等于g(触发警报)。

  3. 最后,func()调用分配给它的函数,并显示警报。

这里要注意的重要一点是函数的声明和调用之间的区别。 func本身只是一个分配了函数的变量,func()实际上运行函数。如果它有帮助,您可以将其func视为函数的“指针”(尽管事实并非如此)。就像其他人指出的那样,这并不是真正的闭包最好的例子,而是函数是 Javascript 中的对象这一事实。

于 2013-09-01T15:01:44.447 回答
1

调用f()返回函数g并将其分配给变量func

func()然后执行g()显示警报消息的调用。

于 2013-09-01T15:02:32.553 回答
0

实际上,这并不是说明闭包的最佳示例。它只是不创造它。

为了在这种情况下适当地说明闭包,代码应如下所示:

function f() {

  var a = 1

  function g() {
    alert(a)
  }

  return g 
}

var func = f();
func() // 1

所以重点是,当函数fget 执行时,它返回 function g,其中包含对被调用函数的执行上下文的引用f(它包含在函数内部声明的所有变量、传递的参数、作用域链等)。通常在执行后垃圾收集器应该从内存中删除执行上下文,但返回的函数g持有对它的引用,所以它不会被删除。

当函数func被调用时,它a从所谓的闭包中访问变量并警告它,但是没有其他方法可以访问这个变量了。

如果你不想深入了解那里发生了什么,我建议你阅读这篇文章。它很老,但非常详细地解释了这个主题。

另一个很好的,我最近发现的,比较容易理解,所以你可以从它开始,然后回到我提到的第一个。

希望这会有所帮助。

于 2013-09-01T15:33:40.507 回答