为什么JavaScript闭包不能与预定义的函数一起使用
Why JavaScript closures will not work with predefined function?
假设我有这个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() { ...}
相关文章:
- setTimeout可以与闭包内的函数一起使用吗
- $location.search() 与外部函数一起使用,重置整个$scope.如何避免它
- 将 JSDoc 与匿名对象和该对象的函数一起使用的正确方法
- While循环与jquery中的某些数学函数一起崩溃
- 如何将setTimeout()与slow函数一起使用
- 此JavaScript函数可以单独使用,但不能与其他JavaScript函数一起使用
- delay()函数不能与jquery中的addClass()函数一起使用
- 如何将URL与JQuery.getJSON()函数一起使用
- .wrap()在与resize函数一起使用时多次添加选择器
- 为什么JavaScript闭包不能与预定义的函数一起使用
- Prototype.js 1.7:将collect与显式函数一起使用会返回与内联函数不同的结果,原因是什么
- JS:转义字符串末尾带有反斜杠的字符串,用于与jQuery函数一起使用
- 如何将 yield 与我自己的函数一起使用
- 如何将 ng-show 与控制器中返回 true/false 的函数一起使用
- 为什么我不能将javascript setInterval与外部文件中的函数一起使用
- 将回调函数与原型函数一起使用
- 将延迟语句与 javascript 函数一起使用
- jQuery 不与 JS 搜索函数一起使用
- 如何将setTimeout与立即调用的函数一起正确使用
- 如何让jquery.each函数与动态元素的.on('change')函数一起工作