Влияние объявленных и необъявленных переменных


В чем основное различие между объявленными и необъявленными переменными JavaScript, так как оператор delete не работает с объявленными переменными?

 var y = 43;     // declares a new variable
 x = 42;

 delete x;       // returns true  (x is a property of the global object and can be deleted)
 delete y;       // returns false (delete doesn't affect variable names) 

Почему это происходит? Переменные, объявленные глобально, также являются свойствами объекта window, так почему же его нельзя удалить?

4 25

4 ответа:

Объявленные и необъявленные глобальные переменные

Механизм хранения и доступа к ним один и тот же, но JavaScript обрабатывает их по-разному в некоторых случаях на основе значения атрибута configurable (описано ниже). При регулярном использовании они должны вести себя одинаково.

Оба существуют в глобальном объекте

Ниже приведены некоторые сравненияобъявленных инеобъявленных глобальных переменных.
var declared = 1;  // Explicit global variable (new variable)
undeclared   = 1;  // Implicit global variable (property of default global object)

window.hasOwnProperty('declared')    // true
window.hasOwnProperty('undeclared')  // true

window.propertyIsEnumerable('declared')    // true
window.propertyIsEnumerable('undeclared')  // true

window.declared     // 1
window.undeclared   // 1

window.declared   = 2;
window.undeclared = 2;

declared     // 2
undeclared   // 2

delete declared     // false
delete undeclared   // true
delete undeclared   // true (same result if delete it again)

delete window.declared     // false
delete window.undeclared   // true (same result if delete it yet again)
delete window.undeclared   // true (still true)

Оба объявили и необъявленные глобальные переменные являются свойствами объекта window (глобальный объект по умолчанию). Ни один из них не наследуется от другого объекта через цепочку прототипов. Они оба существуют непосредственно в объекте window (так как window.hasOwnProperty возвращает true для обоих).

Настраиваемый атрибут

Дляобъявленных глобальных переменных атрибут configurable равен false. Длянеобъявленных глобальных переменных это true. Значение атрибута configurable может извлекаться с помощью getOwnPropertyDescriptor метод, как показано ниже.

var declared = 1;
undeclared = 1;

(Object.getOwnPropertyDescriptor(window, 'declared')).configurable     // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable   // true

Если атрибут configurable свойства истинен, атрибуты свойства могут быть изменены с помощью defineProperty метод, и свойство может быть удалено с помощью delete оператор. В противном случае атрибуты не могут быть изменены, а свойство не может быть удалено таким образом.

Внестрогом режиме оператор delete возвращает true, если свойство конфигурируемо, и возвращает false, если он не настраивается.

Резюме

Объявленная глобальная переменная

  • - свойство глобального объекта по умолчанию.(window)
  • атрибуты свойстване могут быть изменены .
  • нельзя удалить с помощью оператора delete

Необъявленная глобальная переменная

  • - свойство глобального объекта по умолчанию.(window)
  • атрибуты свойства могут быть измененным.
  • Можно удалить с помощью оператора delete

См. также

Главное отличие заключается в том, что переменные объявляются внутри функции. Если вы используете var при объявлении переменной внутри функции, то эта переменная становится локальной переменной. Однако если вы не используете var, то переменная становится глобальной независимо от того, где вы ее объявите (внутри или вне функции).

Когда какая-либо переменная создается с помощью объявления переменной в JavaScript , эти свойства создаются с помощью атрибута "DontDelete", что в основном означает, что созданная переменная не может быть удалена с помощью выражения "delete". Все функции, Аргументы и параметры функции по умолчанию создаются с помощью этого атрибута DontDelete. Вы можете думать о DontDelete как о флаге.

var y = 43;
delete y;         //returns false because it is has a DontDelete attribute

В то время как необъявленное назначение не устанавливает никаких атрибутов, таких как DontDelete . Поэтому , когда мы применяем оператор delete к этой необъявленной переменной, он возвращает true.

x = 42;
delete x;        //returns true because it doesn't have a DontDelete attribute

Разница между назначением свойства и объявлением переменной-последнее устанавливает DontDelete, а первое-нет. вот почему необъявленное назначение создает удаляемое свойство.

Ссылка на то, как именно работает оператор delete

Удаление действует только на свойства объекта. Он не влияет на имена переменных или функций.

В вашем случае x = 42; объявляет переменную X и делает ее свойством глобального объекта. Так что он возвращает истину.

И var y = 43; объявляет глобальную переменную, которая не является частью какого-либо объекта, поэтому возвращает false.