Javascript 对象变量范围
我不确定我在这里做错了什么,或者如果我误解了,请按照 希望有人能解释 下面的示例代码演示了该问题:Javascript 对象变量范围,javascript,variables,scope,global-variables,Javascript,Variables,Scope,Global Variables,我不确定我在这里做错了什么,或者如果我误解了,请按照 希望有人能解释 下面的示例代码演示了该问题: testObjectScope(){ let localObject=this.testObject; localObject["c"]="charlie"; return localObject; } 开发人员控制台中的输出位于函数的第一行: this.testObject: Object a: "alpha" b: "bravo" __proto__: Object
testObjectScope(){
let localObject=this.testObject;
localObject["c"]="charlie";
return localObject;
}
开发人员控制台中的输出位于函数的第一行:
this.testObject: Object
a: "alpha"
b: "bravo"
__proto__: Object
然后在回程线上:
this.testObject: Object
a: "alpha"
b: "bravo"
c: "charlie"
__proto__: Object
localObject: Object
a: "alpha"
b: "bravo"
c: "charlie"
__proto__: Object
但是,我希望“let”不能更改对象属性(即深度副本),它应该是这样的:
this.testObject: Object
a: "alpha"
b: "bravo"
__proto__: Object
localObject: Object
a: "alpha"
b: "bravo"
c: "charlie"
__proto__: Object
因此,不要在函数中声明一个其他地方无法访问的变量。因此,当函数完成且作用域远离函数时,如何更改localObject属性使用testObject创建更改您所做的是将
testObject
分配给localObject
。虽然let
仅在最近的函数作用域下有效,但仍然可以操作testObject
的引用。
尝试按值传递(不会影响原始对象),而不是按引用传递,如下所示:
testObjectScope(){
let localObject = {};
localObject["a"] = this.testObject["a"];
localObject["b"] = this.testObject["b"];
localObject["c"] = "charlie";
return localObject;
}
您将看到testObject
保持不变
testObjectScope(){
let localObject = $.extend(true, {}, this.testObject);
localObject["c"]="charlie";
return localObject;
}
返回值如下所示:
this.testObject: Object
a: "alpha"
b: "bravo"
__proto__: Object
localObject: Object
a: "alpha"
b: "bravo"
c: "charlie"
__proto__: Object
“然而,我希望‘let’不能更改对象属性(即深度复制)。”我不确定我是否遵循
let
只声明一个变量。除此之外,它不会做任何其他事情。感谢您的澄清,并将其附加到问题Yes中,让
声明一个变量,您无法从其他范围访问该变量,但您没有访问该变量以更改此.testObject
让localObject
仅仅是一个指向同一对象的变量,您不会得到该对象的副本<代码>设a={};设b=a;让b.foo=“bar”;log(a)将向您显示{foo:“bar”}
,因为a
和b
都是相同的对象。如果是两个不同的变量也没关系,这能回答你的问题吗?关闭,但“手动”这样做容易出错,因此我的解决方案适用于不同的对象。无论如何,谢谢是的,你是对的,但主要的想法是你需要深度克隆对象。不要试图操作原始对象的引用。否则你就达不到预期。