var a = something 和 window.a = someting 之间有什么区别吗?

Is there any difference between var a = something and window.a = someting?

我是 JavaScript 世界的新手,在我对 全局对象 (通常是 window)了解很多之后我感到很困惑,并且知道它只是一个对象,就像我创建的任何对象一样,var 在全局对象中设置属性,这与 let

不同

之后 window.a = something(like in any object)和 var a = something 之间有什么区别吗?

如果您想要全局变量 a,请使用 window.a =。这意味着任何 JS 代码都可以访问这个变量。而 var a = 是声明变量的常用方式。在这种情况下,变量只能在其容器内访问。

不,除了在 Node.js 中,其中 a = 5var a = 5(连同 letconst)不会将值分配给global.a。你必须明确地说 global.a = 5.

在全局上下文中,使用 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 没有区别,但在函数内,当函数 returns.
  • 时,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