Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript es6导出的对象值是否未更新?_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript es6导出的对象值是否未更新?

Javascript es6导出的对象值是否未更新?,javascript,ecmascript-6,Javascript,Ecmascript 6,我在ES6中导出一个工厂函数,它返回一个具有属性的对象。 调用工厂时,将创建对象,但其值不会更新 例如: // factory.js let counter = 1; let factory = () => { let increment = function(){ counter++; } return { counter, increment }; } export default factory; // main.js import facto

我在ES6中导出一个工厂函数,它返回一个具有属性的对象。 调用工厂时,将创建对象,但其值不会更新

例如:

// factory.js
let counter = 1;
let factory = () => {
    let increment = function(){
      counter++;
    }

  return { counter, increment };
}

export default factory;


// main.js
import factory from './factory';

let f = factory();
console.log(f.counter); // =>1
f.increment();
console.log(f.counter); // => stil 1, not 2?
有人能解释为什么会这样吗?这是ES6功能,还是与我使用webpack和babel(es2015预设)有关

我发现了这一点,但它并没有描述相同的用例:

在JavaScript中是

工厂
函数返回对象时,其属性
计数器
将从
工厂.js
范围内声明的
计数器
中分配一个值。这本质上意味着对象上的
计数器
属性收到了值的副本——没有任何东西将
计数器
变量的值与
计数器
属性相关联

let counter = 1;

let factory = () => {
  let increment = function () {
    // The `++` operates on the `counter` variable declared in the scope of `factory.js`.
    // There is no link between the value `counter` in the scope of `factory.js` and the `counter` as the property of the object returned.
    // As a result when the `counter` variable is incremented, the `counter` property remains the same as the value initially passed to it.
    counter++;
  };
};
当您递增
计数器
时,您正在递增在
factory.js
范围内声明的变量的值。变量的值是一个
数字
,因此是一个原语。原语值按值传递,因此变量
计数器
和属性
计数器
之间没有链接

希望所有这些都有意义。如果您想更多地阅读通过值传递的想法(与通过引用传递相比),您可以看到以下问题:

此时,您可能会问如何解决此问题

您不需要递增
计数器
,而需要递增
此计数器
。像这样:

let increment = () => {
  this.counter++;
};

这是因为
的上下文是从函数
工厂
返回的对象。
计数器
属性位于为调用
工厂
的结果指定的变量上

感谢@wing提供的详细答案!这让我意识到,是新的解构语法让我困惑:
return{counter,increment}我把属性和值搞混了。“在JavaScript中,基本类型是按值传递的。”所有内容都是按值传递的,但这并不相关,因为在OP的示例中,根本没有传递任何内容。“这是函数工厂的上下文”上下文是不相关的,
的值是工厂返回的对象。@numblock“让我困惑的是新的解构语法”这不是解构,而是对象文字。@numblock不用担心。只是想添加到zeroflagl的注释中:您在那里使用的不是而是。@zeroflagl“所有内容都是按值传递的,但这并不相关,因为在OP的示例中根本没有传递任何内容。”在OP的示例中,
计数器
变量的值被传递给要返回的对象。当我第一次读到这个问题时,我把它解释为一个OP,它打算在一个对象属性上增加一个值,他们认为该属性与一个同名变量的原始声明相关联。因此,我解释了问题的原因–关于如何将
计数器的值传递给要返回的对象以及如何访问它的误解。这与ES6或模块完全无关。
let increment = () => {
  this.counter++;
};