Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Почему оператор delete не удаляет локальную переменную внутри функции?

#javascript


var output = (function(x){
    delete x;
    return x;
})(0);

console.log(output);


Вопрос в следующем - почему x не удаляется, ведь оно является свойством arguments?
    


Ответы

Ответ 1



Оператор delete может удалять только свойства объекта: delete эффективен только применительно к свойствам объектов. Он не оказывает никакого влияния на имена переменных и функций. Источник. А поскольку x является записью Declarative Environment Record (очень грубо говоря - не является свойством объекта, а просто переменной), то и удалить переменную таким образом нельзя. Более того, даже не всякое свойство объекта можно удалить при помощи оператора delete (и я сейчас не о дескрипторах свойств, хотя это и самое очевидное). Например, нельзя удалить свойство глобального объекта, определенное не явно, а как переменная. Например: var a = 1; console.log(a === this.a); // `a` является свойством глобального объекта delete a; //false console.log(a); // 1 Однако: this.a = 1; console.log(a === this.a); // все еще равны delete a; // true console.log(a); // error Из комментариев А разве x не является свойством псевдо-массива arguments? Разумеется, является. "use strict"; (function(x){ console.log(arguments[0]); delete arguments[0]; console.log(arguments[0]); console.log(x); // все еще есть! }(0)); Но поскольку удалить можно только свойство объекта, то и обращаться нужно непосредственно к свойству объекта. Однако при помощи такого подхода вы и удалите только свойство объекта. А, поскольку локальные переменные (точнее говоря, формальные параметры функции) никак не связаны с объектом arguments, то формальный параметр x по-прежнему доступен (именно как локальная переменная, но не как свойство arguments).

Комментариев нет:

Отправить комментарий