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

в чем основное различие между объявленными и необъявленными переменными 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


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

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

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