В глобальном контексте использование var
против присвоения window
действительно очень похоже.Однако да существует ряд различий.Вот некоторые из них, о которых я могу подумать:
var
объявления hoisted , что означает, что вы можете использовать переменную, объявленную с var
перед вами 'мы объявили это.С другой стороны, попытка использовать что-то, назначенное для window
до того, как это назначение произойдет, приведет к ReferenceError
:
// This is okay. The variable declaration is hoisted, so you can use it before
// it's been declared (although it won't be assigned its value until later).
console.log(a);
var a = "hello world";
// On the other hand, without var, this creates an error.
console.log(a);
window.a = "hello world";
- Переменные, объявленные с
var
, нельзя удалить из глобального объекта, но можно удалить простые присвоения window
:
var a = "hello world";
console.log(a);
delete window.a; // Does nothing for `var`.
console.log(a);
window.a = "hello world";
console.log(a);
delete window.a; // This will delete it, further access creates a ReferenceError.
console.log(a);
- И, конечно же, объявления
var
ограничены текущим контекстом выполнения.В глобальной области это не отличается от присвоения window
, но внутри функции var
исчезнет, когда функция вернется.
function foo() {
var a = "hello world";
console.log(a);
}
foo();
console.log(a); // ReferenceError
function foo() {
window.a = "hello world";
console.log(a);
}
foo();
console.log(a); // still exists here