JavaScript作用域和闭包:value属性不返回递增的值
困惑于JavaScript作用域和闭包:value属性不返回递增的值,javascript,scope,closures,javascript-objects,Javascript,Scope,Closures,Javascript Objects,困惑于增量如何更改值,而更改的值可供获取值访问,但不可供同一对象的属性访问 这是否与increment和getValue方法是定义值的匿名函数的内部函数有关 var myObject = function() { var value = 0; return { increment: function(inc){ value += typeof inc === 'number' ? inc : 1; }, g
增量
如何更改值
,而更改的值
可供获取值
访问,但不可供同一对象的属性访问
这是否与increment和getValue方法是定义值的匿名函数的内部函数有关
var myObject = function() {
var value = 0;
return {
increment: function(inc){
value += typeof inc === 'number' ? inc : 1;
},
getValue: function(){
return value;
},
value: value,
};
}();
console.log(myObject.getValue()); // 0
myObject.increment(2);
console.log(myObject.getValue()); // 2
console.log(myObject.value); // 0
myObject.increment(2);
console.log(myObject.getValue()); // 4
var foo
创建一个变量,该变量的作用域是在中声明的函数。它可以作为该函数或第一个函数中声明的另一个函数中的任何位置的foo
访问
myObject.foo
创建附加到对象的属性。它可以作为?.foo
访问,其中?
是对myObject
所引用对象的引用。可以在任何可以找到对象引用的地方执行此操作
属性不是变量。变量不是属性。(例外情况是全局变量是全局(浏览器中的窗口
)对象的属性
创建对象时,您说:
value: value,
但这会将value
变量的当前值复制到value
属性
这是一个数字,不是参考号
更新
value
变量时,value
属性保持不变。var foo
创建一个变量,该变量的作用域为在中声明的函数。它可以作为该函数中的任何位置或在第一个函数中声明的另一个函数访问
myObject.foo
创建一个附加到对象的属性。它可以作为?.foo
进行访问,其中?
是对myObject
作为引用的对象的引用。您可以在任何可以找到该对象引用的地方执行此操作
属性不是变量。变量不是属性。(例外情况是全局变量是全局(浏览器中的窗口
)对象的属性
创建对象时,您说:
value: value,
但这会将value
变量的当前值复制到value
属性
这是一个数字,不是参考号
当您更新值
变量时,值
属性保持不变。其他答案(如)已经非常透彻地解释了问题所在。下面是一种适当的方法,通过最小程度地修改当前方法来纠正问题:
var myObject=function(){
返回{
增量:功能(inc){
this.value+=typeof inc==“number”?inc:1;
},
getValue:function(){
返回此.value;
},
数值:0
};
}();
console.log(myObject.getValue());//0
对象增量(2);
console.log(myObject.getValue());//2
console.log(myObject.value);//2
对象增量(2);
console.log(myObject.getValue());//4
console.log(myObject.value);/4
类似的其他答案已经非常透彻地解释了问题的原因。下面是一个适当的方法,它可以最小限度地修改您当前的方法来纠正问题:
var myObject=function(){
返回{
增量:功能(inc){
this.value+=typeof inc==“number”?inc:1;
},
getValue:function(){
返回此.value;
},
数值:0
};
}();
console.log(myObject.getValue());//0
对象增量(2);
console.log(myObject.getValue());//2
console.log(myObject.value);//2
对象增量(2);
console.log(myObject.getValue());//4
console.log(myObject.value);//4复制数字和字符串。value:value
将value
的当前值复制到名为value
的属性中,因为它包含一个原始数据类型,所以不保存对它的引用。这与作用域无关。原因myObject.value
返回原始数据类型l值是因为它从不递增。返回对象的value
属性和内部value
变量是两个不同的东西,它们之间没有任何关系,除非属性是使用内部value
变量最初具有的值创建的。Relev蚂蚁:正如@MikaelLennholm所说。myObject.value
与myObject.getValue()不同
。我相信这会让您感到困惑,因为您如何命名var value=0
,请尝试将其更改为:var helloWorld=0;
。现在,当您执行myObject.value
时,因为value:helloWorld
意味着您应该得到0。或者,当您执行myObject.getValue()
您现在正在处理myObject
中的闭包范围,这就是您通过myObject.increment(inc)修改的内容
复制数字和字符串。value:value
将value
的当前值复制到名为value
的属性中,因为它包含一个原始数据类型,所以不会保存对它的引用。这与作用域无关。原因myObject.value
返回原始值e是因为它永远不会递增。返回对象的value
属性和内部value
变量是两个不同的东西,它们之间没有任何关系,除非属性是使用内部value
变量最初具有的值创建的。相关:I正如@MikaelLennholm所说,myObject.value
与myObject.getValue()
不同。我相信这会让您感到困惑,因为您如何命名var value=0
,请尝试将其更改为:var helloWorld=