我不明白以下javascript代码的意义:

时间:2013-09-01 14:57:53

标签: javascript closures

我不明白以下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

上找到了它

3 个答案:

答案 0 :(得分:1)

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

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

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

  4. 这里需要注意的重要一点是声明和函数调用之间的区别。 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更容易理解,所以你可以从它开始,然后回到我提到的第一个。

希望这有点帮助。