什么';使用闭包时使用以下JavaScript语法的原因是什么?
在研究闭包时,我看了开发人员的Mozilla文章,看到了下面的代码:什么';使用闭包时使用以下JavaScript语法的原因是什么?,javascript,function,variables,closures,Javascript,Function,Variables,Closures,在研究闭包时,我看了开发人员的Mozilla文章,看到了下面的代码: var counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { ch
var counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
};
})();
console.log(counter.value()); // 0.
counter.increment();
counter.increment();
console.log(counter.value()); // 2.
counter.decrement();
console.log(counter.value()); // 1.
我对函数如何归属于变量counter
感到困惑,因为函数最初是由这些括号解析的,毕竟,还有两个不可解析的括号在一起。。。我只是想知道,这种语法的原因是什么?我当然会这样做:
var counter = function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
};
};
但后来我发现了错误
未捕获类型错误:counter.value不是函数
当我执行console.log(counter.value())时代码>
有人能给我解释一下吗?您看到的是一个立即调用的函数表达式或IIFE。此代码正在创建一个函数,然后立即调用该函数,然后将该函数的返回值分配给计数器
。因此,计数器
不是一个函数,它是一个具有三个属性的对象:增量
,减量
,和值
他们使用iLife的原因是为了使本质上是一个私有变量privateCounter
仅在该函数内的其他代码的作用域内,这意味着只有增量
、减量
、和值
可以访问它
如果他们不关心将变量设为私有,则等效代码为:
var publicCounter = 0;
function changeBy(val) {
publicCounter += val;
}
var counter = {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return publicCounter;
}
}