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).
Комментариев нет:
Отправить комментарий