Влияние объявленных и необъявленных переменных
В чем основное различие между объявленными и необъявленными переменными 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 ответа:
Объявленные и необъявленные глобальные переменные
Механизм хранения и доступа к ним один и тот же, но 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, а первое-нет. вот почему необъявленное назначение создает удаляемое свойство.
Удаление действует только на свойства объекта. Он не влияет на имена переменных или функций.
В вашем случае x = 42; объявляет переменную X и делает ее свойством глобального объекта. Так что он возвращает истину.
И var y = 43; объявляет глобальную переменную, которая не является частью какого-либо объекта, поэтому возвращает false.