Область видимости переменной объекта - PullRequest
0 голосов
/ 31 октября 2019

Я не уверен, что я делаю здесь неправильно, или если я неправильно понимаю, пусть vs var / this согласно https://www.w3schools.com/js/js_let.asp Надеюсь, кто-то может объяснить.

Приведенный ниже пример кода демонстрирует проблему:

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

, поэтому' let 'не объявляет переменную внутри функции, к которой нельзя получить доступ нигдеостальное. Поэтому, когда функция завершена и область видимости удалена от функции, как она меняет свойство localObject, создайте изменение с помощью testObject

Ответы [ 2 ]

0 голосов
/ 31 октября 2019
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
0 голосов
/ 31 октября 2019

То, что вы сделали, это присвоение testObject для localObject. Хотя let действителен только для ближайшей области действия, вы все равно можете использовать ссылку testObject. Попробуйте передать по значению (которое не повлияет на исходный объект) вместо передачи по ссылке, как показано ниже:

testObjectScope(){
    let localObject = {};
    localObject["a"] = this.testObject["a"];
    localObject["b"] = this.testObject["b"];
    localObject["c"] = "charlie";
    return localObject;
}

Вы увидите, что testObject остается прежним.

...