【问题标题】:Is there any difference between var a = something and window.a = someting?var a = something 和 window.a = something 之间有什么区别吗?
【发布时间】:2018-10-04 00:52:47
【问题描述】:

我是 JavaScript 世界的新手,我对 全局对象(通常是窗口)了解很多并且知道它只是一个对象,就像我要创建的任何对象一样,我很困惑var 不同于 let

在全局对象中设置属性

在那之后 window.a = something(像任何对象)和 var a = something 之间有什么区别吗?

【问题讨论】:

  • 在全球范围内,没有什么重要的我能想到的

标签: javascript variables global-variables global-object


【解决方案1】:

在全局上下文中,使用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

【讨论】:

  • 好的,但是就像您在第三个区别中所说的那样,var 声明的范围仅限于当前执行上下文。但窗口不是。 为什么在没有用 var 声明的情况下给某物赋值时会创建一个全局对象(当然是在容器内)?这是否等于 window.something @crice
  • 是的,给一个未声明的变量赋值在很大程度上与给window赋值是一样的。但是,在严格模式下,前者会出错,但后者仍然是允许的。如果您不是在严格模式下,那么两者是相同的 afaik。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    不,除了在 Node.js 中,a = 5 或 var a = 5(以及 let 和 const)不会将值分配给 global.a。你必须明确地说global.a = 5。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 1970-01-01
      • 2013-01-12
      • 2015-04-11
      • 2018-12-31
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多