Есть ли разница между var a = something и window.a = something?

Я новичок в мире JavaScript, и я сбит с толку после того, как много узнал о глобальном объекте (обычно это окно) и знал, что это просто объект, как и любой другой объект, который я создам, и что >var задает свойства в глобальном объекте, в отличие от let

после этого Есть ли разница между window.a = something (как и в любом объекте) и var a = something?


person Ahmed Hamed    schedule 04.10.2018    source источник
comment
в глобальном контексте ничего существенного, что я могу придумать   -  person Jaromanda X    schedule 04.10.2018


Ответы (3)


В глобальном контексте использование var и назначение window действительно очень похожи. Однако да есть ряд отличий. Вот несколько, о которых я могу думать:


  • Объявления var поднимаются, что означает, что вы можете использовать переменную, объявленную с помощью 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


person CRice    schedule 04.10.2018
comment
Хорошо, но, как вы сказали в третьем отличии, объявления var привязаны к текущему контексту выполнения. но окна нет. Почему при присвоении значения чему-либо без объявления его с помощью var создается глобальный объект (конечно, внутри контейнера)? это равно window.something @crice - person Ahmed Hamed; 05.10.2018
comment
Да, присвоение значения необъявленной переменной по большей части такое же, как присвоение window. Однако в строгом режиме первое будет считаться ошибкой, а второе по-прежнему разрешено. Если вы не в строгом режиме, то это одно и то же. - person CRice; 05.10.2018

Вы используете window.a =, если хотите, чтобы переменная a была глобальной. Это означает, что любой JS-код имеет доступ к этой переменной. В то время как var a = является широко используемым способом объявления переменной. В этом случае переменная доступна только внутри своего контейнера.

person Erlisar Vasquez    schedule 04.10.2018

Нет, за исключением Node.js, где наличие a = 5 или var a = 5 (наряду с let и const) не будет присваивать значение global.a. Вы должны явно сказать global.a = 5.

person Community    schedule 04.10.2018