Страницы

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

пятница, 15 февраля 2019 г.

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

var output = (function(x){ delete x; return x; })(0);
console.log(output);
Вопрос в следующем - почему x не удаляется, ведь оно является свойством arguments?


Ответ

Оператор 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).

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

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