假设我有这个JavaScript闭包:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
我给add
打了三次电话:
add();
add();
add();
现在,自调用函数中的计数器等于3。但是,如果自调用函数是预定义的,甚至是匿名函数,那么为什么上面的内容不会增加计数器或保持父函数的作用域有效呢?
我所说的预定义函数是指标准函数声明,类似于以下内容:
function testingjsclosure()
{
var counter = 0;
return function(){return counter += 1;}
}
add = testingjsclosure();
这里没有自调用函数。
表达式
function () { var counter = 0; return ...; }
具有一个具有局部状态并返回特定值的函数作为值。所以
var add = (function () { var counter = 0; return ...; })();
调用它并将返回的值分配给CCD_ 2。这个值就是
function () {return counter += 1;}
其是递增并返回该特定局部变量的函数。因此,调用add
会调用该函数,从而递增并返回特定的局部变量。
但是
add = testingjsclosure();
调用不带参数的testingjsclosure,并将其返回值分配给add。
function(){ ... }
类似于表达式...
周围的引号,因为在调用具有函数表达式值的变量之前,不会对该表达式求值。
而
function testingjsclosure() { ...}
就像写
var testingjsclosure = function() { ...}