javascript - 为什么 iife 中 `X` 的值会根据我们访问它的方式发生变化?

标签 javascript iife

我有以下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/

相关文章:

javascript - 检测用户输入的文本框的值

javascript - IIFE及参数

javascript - 当我将 IIFE 分配给变量时,IIFE 如何工作?

javascript - 如何使用模板从另一个 IIFE 访问一个 IIFE 内的变量?

javascript - 意外行为 : Javascript, setTimeout() 和 IIFE

javascript - Sigma JS 节点动画

javascript - 此 Accordion 在同一页面上的多个实例

javascript - Django - 在获取 POST 后显示 Jsonresponse

javascript - 除以无穷大

javascript - 在 JavaScript 中,!function(){}() 相对于 (function () {})() 的优势是什么?