Влияние объявленных и необъявленных переменных
в чем основное различие между объявленными и необъявленными переменными 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 обрабатывает их по-разному в некоторых случаях на основе значения (описано ниже). При регулярном использовании они должны вести себя одинаково.
оба существуют в глобальном объекте
Ниже приведены некоторые сравнения объявил и незаявленных глобальные переменная.
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
object (глобальный объект по умолчанию). Ни один из них не наследуется от другого объекта через цепочку прототипов. Они оба существуют непосредственно в и 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
оператор
см. также
основное различие заключается в том, когда вы объявляете переменные внутри функции. Если вы используете var
когда вы объявляете переменную внутри функции, эта переменная становится локальной переменной. Однако, если вы не используете var
, то переменная становится глобальной переменной, независимо от того, где вы объявляете его (внутри или вне функции).
когда любая переменная создается через объявление переменной в JavaScript , эти свойства создаются с помощью "DontDelete" атрибут, который в основном означает, что созданная переменная не может быть удалена с помощью выражения" удалить". Все функции, аргументы, параметры функции по умолчанию создаются с помощью этого атрибута DontDelete. Вы можете думать о DontDelete как флаг.
var y = 43;
delete y; //returns false because it is has a DontDelete attribute
в то время как необъявленное назначение не устанавливает никаких атрибутов, таких как DontDelete . Поэтому, когда мы применяем удалить оператор для этой необъявленной переменной возвращает true.
x = 42;
delete x; //returns true because it doesn't have a DontDelete attribute
разница между присвоением свойства и объявлением переменной-последнее устанавливает DontDelete, тогда как первое-нет. Вот почему необъявленное назначение создает свойство deletable.
delete действует только на свойства объекта. Он не влияет на имена переменных или функций.
в вашем случае x = 42; объявляет переменную X и делает ее свойством глобального объекта. Поэтому он возвращает true.
и var y = 43; объявляет глобальную переменную, которая не является частью какого-либо объекта, поэтому она возвращает false.