我有以下js代码。
var a = (function(){
var x = 0;
var y = function(){
x++;
console.log(x);
}
var z = function(){
return x;
}
return {
x, y, z
}
})();
在这里,当我第一次尝试访问 a.x
时,它给我输出 0
(这是预期的,因为 x 被初始化为 0),然后我是使用函数 y
增加 x
的值。但是在将 x
的值递增两次(或者可能超过 2 次)之后,当我尝试访问 x
的值时,它仍然给我 a.x=0
。我无法理解为什么会这样,因为我已经使用函数 y
更改了 x
的值。那为什么它没有改变。
(但是,当我通过某个函数访问 x 的值时,它会给出增量值。为什么会有这种不同的行为。如果我直接访问同一个变量,那么它会给出一些输出,当我返回相同的变量值时一些功能它正在提供一些其他值(value)。为什么?)
var a = (function(){
var x = 0;
var y = function(){
x++;
console.log(x);
}
var z = function(){
return x;
}
return {
x, y, z
}
})();
console.log(a.x);
a.y();
a.y();
console.log(a.x);
console.log(a.z());
我猜想是因为关闭但不确定。
最佳答案
最后一行:
return { x, y, z };
等同于:
return { x: x, y: y, z: z };
因此它将局部变量复制到对象中。对于无关紧要的函数或对象,因为它们是通过引用复制的,而原语是通过值复制的,因此您有两个不同的 z
,一个局部变量和一个对象属性。
关于javascript - 为什么 iife 中 `X` 的值会根据我们访问它的方式发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53726729/