Javascript es6导出的对象值是否未更新?
我在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
// 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++;
};