以下是代码:
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。希望你能帮我解决问题。
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());
你需要调用第一个函数一次,并在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
当 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
是同一个调用,因此在调用它们时2
:
var foo = fn();
var bar = fn();
两者都私下var x=1
。因此,当您再次调用它们时foo(); //3
内部函数fn2
是使用 increment 语句调用的内部函数