Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 对象变量范围_Javascript_Variables_Scope_Global Variables - Fatal编程技术网

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
都是相同的对象。如果是两个不同的变量也没关系,这能回答你的问题吗?关闭,但“手动”这样做容易出错,因此我的解决方案适用于不同的对象。无论如何,谢谢是的,你是对的,但主要的想法是你需要深度克隆对象。不要试图操作原始对象的引用。否则你就达不到预期。