有人可以解释这个JavaScript自动执行功能吗?

Ato*_*mix 12 javascript logic

var foo = (function(){
  var x = 0;
  return function(){return x++;};
})()
Run Code Online (Sandbox Code Playgroud)

为什么var x = 0表达式只运行一次是我对此最大的误解.

Lee*_*Lee 16

你的代码:

var foo = (function(){
  var x = 0;
  return function(){return x++;};
})()
Run Code Online (Sandbox Code Playgroud)

相当于这段代码:

function f(){
  var x = 0;
  return function(){return x++;};
}
var foo = f();
Run Code Online (Sandbox Code Playgroud)

当你像这样分解它时,很容易看到该函数f()只被调用一次.它定义x,然后返回一个新的被定义的函数的局部范围f.这个新函数通常被称为"匿名函数"(意味着它没有名称)或"闭包".事实上,javascript中的所有函数都是"闭包" - 无论它们是否被命名.术语"闭包"仅仅意味着函数保留对父函数范围中定义的变量的访问 - 即使在父函数退出之后也是如此.

所以现在,foo包含从中返回的新函数(闭包)f.您可以foo()根据需要多次拨打电话- 每次都这样做,x将返回并递增.由于x存在于闭包的父作用域中,因此它的值将在对闭包的多次调用中持续存在.

更重要的是......没有其他的代码现在可以访问x一次f()已退出-这基本上意味着,x现在是封闭的"私有数据".挺整洁的吧?

  • @tobyodavies:任何仍支持`eval()`的ECMA版本都要求*all*函数保留对父作用域的引用.可能还有其他例子 - 但这是显而易见的例子.[这里是关于jsFiddle的证明](http://jsfiddle.net/coltrane/WFeb6/1/). (2认同)

Jac*_*kin 6

该变量foo被分配给自执行函数的结果,如下所示:

声明一个名为xinitialized 的变量0.返回一个函数,在调用时,将递增值x.

所以在这一点上,foo引用一个函数.

你调用它的方式是:

foo();
Run Code Online (Sandbox Code Playgroud)

第一次来调用它,则返回值将是0的话1,2...

好了,等一下......,应该不会是1,2,3...?

你是在正确的轨道,但在这种情况下,这是不正确的原因是因为预增量后增量之间的差异.(++varvs var++).所不同的是,结果预增量是增量后的变量的值,而结果后增量是变量的值之前增加.

这个例子说明了闭包的概念,这实际上意味着内部函数可以访问其周围函数中定义的变量.

  • 轻微校正,它将是"0",增量的*结果*是"1",但返回的是原始的"0".如果它是`++ x`,你会得到`1`,`2`等. (2认同)