Подтвердить что ты не робот

Эффект объявленных и необъявленных переменных

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

 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, поэтому почему его нельзя удалить?

4b9b3361

Ответ 1

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

Механизм хранения и доступа к ним один и тот же, но 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 свойства имеет значение true, атрибуты свойства могут быть изменены с помощью метода defineProperty и свойство можно удалить с помощью оператора delete. В противном случае атрибуты не могут быть изменены, и свойство не может быть удалено таким образом.

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

Резюме

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

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

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

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

См. также

Ответ 2

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

Ответ 3

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

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

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

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

Разница между присвоением свойств и объявлением переменной - последняя устанавливает DontDelete, тогда как предыдущая не делает. Именно поэтому необъявленное присваивание создает удаляемое свойство.

Ссылка на то, как работает оператор удаления

Ответ 4

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

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

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