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

215
15 марта 2018, 11:44
var output = (function(x){
    delete x;
    return x;
})(0);
console.log(output);

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

Answer 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).

READ ALSO
Vuex в Nuxt.js копирование

Vuex в Nuxt.js копирование

Получается так что Vuex в Nuxt общий для всех подключенных пользователейКак сделать так что бы каждому пользователю отдавалась копия, а не оригинальный...

208
bootstrap carousel +slick slider проблема совместимости

bootstrap carousel +slick slider проблема совместимости

Здравствуйте! Помогите пожалуйстаКогда бутстрап карусель(слайд с ней) оказывается в правой части слик слайдера (после прокрутки)- она перестает...

278
выдача кода с сервера

выдача кода с сервера

Как реализовать выдачу рандомного кода с сервераТо есть при нажатии "получить код" происходила его выдача

230
barba js проблемы с View

barba js проблемы с View

не отрабатывает Viewsт

192