2015-06-28 2 views
1

Раньше я думал, что когда вы объявляете переменную в глобальном пространстве имен, в контексте веб-браузера она привязывается к объекту окна. Кажется, это происходит, но должна быть разница между объявлением глобальной переменной с ключевым словом var и присоединением ее непосредственно к объекту окна. См. Это с консоли Chrome:Глобальная путаница var: var a vs window.a

var a; 
> undefined 
window.hasOwnProperty("a") 
> true 
window.a = 0 
> 0 
delete window.a 
> false 
window.hasOwnProperty("a") 
> true 
/* so it's still there */ 
window.a 
> 0 

window.b = undefined 
> undefined 
window.hasOwnProperty("b") 
> true 
window.b = 0 
> 0 
delete window.b 
> true 
window.hasOwnProperty("b") 
> false 
window.b 
> undefined 

Может кто-то пролить свет на это?

+1

Вы должны использовать '' '' и '' b "' вместо 'a' и' b' в 'hasOwnProperty'! – Bergi

+0

Спасибо, отредактируйте его соответствующим образом. – connexo

ответ

3

Вы определили единственное существенное различие: если вы используете var, вы не можете delete свойство, которое создается на глобальном объекте. Если вы этого не сделаете, если вы просто назначаете свойство для его создания, то, как и все свойства объекта, вы можете его удалить.

Это кажется немного произвольным, но на самом деле оно имеет смысл: в конце концов вы не можете удалить оператор var во время выполнения, а семантика заключается в том, что var создает свойство в объекте привязки переменной контекста текущего контекста выполнения. (Whew, это был полный глоток.) ​​ И поэтому имеет смысл, что он создает неизменяемое свойство.

Подробнее см. В §10.5 и §10.2.1.1.2 спецификации. В §10.5 в основном говорится, что var запускает CreateMutableBinding (§10.2.1.1.2) с аргументом D, являющимся ложным (false = не удаляется).

+0

Подводит итог тому, что я узнал, да. Однако он не объясняет, почему это работает. – connexo

+1

@connexo: Вот как это работает. Почему бы и нет? Имо имеет смысл, что вы не можете «декомпилировать» 'var'iables. – Bergi

+1

@connexo - потому что 'delete' удаляет свойства из объектов. Он не удаляет переменные. Таким образом, они сделали так, что он работает, чтобы удалить свойство на 'window'-объекте, но не если вы объявите его с помощью' var'. Итак, для этого есть какая-то логика, но почему они выбрали эту логику, она известна только тем, кто ее изначально решил. – jfriend00

Смежные вопросы