以下是代码:
function fn() {
var x = 1;
function fn2() {
x++;
console.log(x);
}
return fn2;
}
var foo = fn();
var bar = fn();
foo(); //2
bar(); //2
foo(); //3

我遇到了一个问题,我无法弄清楚为什么结果不是2 3 4 。我的意思是,根据封闭原则,foo和bar应该保持范围功能 fn ,所以我觉得foo和bar有相同的 x 。希望你能帮我解决问题。
答案 0 :(得分:1)
foo
和bar
不共享相同的x
。调用x
时会创建fn
。因此,每次拨打fn
都会创建一个全新的x
,可以通过将返回的品牌定义函数fn2
进行访问。
要检查foo
和bar
是否共享相同的x
,请举例说明:
function fn() {
var x = 1;
function fn2() {
x++;
return x;
}
return fn2;
}
var foo = fn();
var bar = fn();
console.log("foo: " + foo());
console.log("bar: " + bar());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("foo: " + foo());
console.log("bar: " + bar());
答案 1 :(得分:1)
你需要调用第一个函数并在x
上构建一个闭包,然后返回一个带有函数的函数。
var fn = function () {
var x = 1;
return function () {
return function () {
x++;
console.log(x);
};
};
}();
var foo = fn();
var bar = fn();
foo(); //2
bar(); //3
foo(); //4

答案 2 :(得分:0)
当var x创建一个私有变量时,每次分配fn()时都会重新创建它。如果您希望继续使用,只需将var x更改为this.x:
fn = (function() {
this.x = 1;
function fn2() {
this.x++;
console.log(this.x);
}
return fn2;
});
var foo = fn();
var bar = fn();
foo(); //2
bar(); //3
foo(); //4
答案 3 :(得分:0)
这两个是相同的调用,因此当你调用它们时2
:
var foo = fn();
var bar = fn();
两者都私下设置var x=1
。因此,当您再次调用它们foo(); //3
时,内部函数fn2
是使用递增语句调用的函数