Это работает в случае с 'var', потому что переменная-stop в разрешении области создается. Без 'var' вы просто убегаете, просматривая цепочки областей видимости, и вам говорят . Если вы действительно хотите использовать глобальную переменную:
// This is fine because assignment always sets a property value
// in this case (no 'var ga') it's the same as window.ga = window.ga || []
ga = window.ga || []
Или:
// Once again, only the lookup is affected with "running off"
// the lookup chain. It's not that the variable has no value --
// the problem is there IS NO VARIABLE.
if (!window.ga) {
ga = []
}
Или даже это:
// First line is the same as window.ga = window.ga,
// but now the property ga is guaranteed to exist on the window object --
// the VALUE of the property may (still) be undefined
ga = window.ga
ga = ga || []
Обратите внимание, что в обоих этих случаях я явно вызывал ga
как свойство объекта window
(global).
Подробнее об этом можно прочитать здесь: Разрешение идентификатора, контексты выполнения и области видимости .
Размещение из var в области действия не имеет значения. Все следующие одинаковы:
var ga
ga = ga || []
var ga = ga || []
ga = ga || []
var ga