JavaScript中的全局变量和窗口变量是什么?

b.g*_*b.g 7 html javascript variables

我在W3Schools上发现了这些陈述.

使用JavaScript,全局范围是完整的JavaScript环境.在HTML中,全局范围是窗口对象.所有全局变量都属于window对象.您的全局变量(或函数)可以覆盖窗口变量(或函数).

这些语句是否意味着全局变量和窗口变量基本相同?我可以从另一个窗口访问一个窗口变量,因为它与窗口对象相关联,或者一旦我们导航到另一个窗口就删除了窗口对象?

还有这个:

任何函数(包括窗口对象)都可以覆盖全局变量和函数.

一个相关的例子如下:

<p>
In HTML, all global variables will become window variables.
</p>

<p id="demo"></p>

<script>
var carName = "Volvo";

// code here can use window.carName
document.getElementById("demo").innerHTML = "I can display " + window.carName;
</script>
Run Code Online (Sandbox Code Playgroud)

什么是窗口对象/变量,它与全局对象/变量有什么不同?

我真的很困惑.任何人都可以用一个例子详细说明吗?

Hei*_*ing 6

所有JavaScript代码都在某些环境中执行,最常见的是在浏览器中执行.执行的代码必须在称为全局上下文或全局范围的某个"根"范围内执行(将其视为主容器).在您的浏览器中,此"根"范围是窗口对象(每个选项卡/页面/ iframe的唯一窗口对象).

这就是为什么在示例中变量在全局范围内声明时,var carName = "Volvo";您可以在窗口对象上访问此变量window.carName,因为在浏览"窗口"对象时是全局对象.

当您使用Node执行javascript时,例如,全局对象非常适合命名,global并且在该环境中,如果您声明var carName = "Volvo";也可以使用global.carName(仅在nodejs REPL上为true,则var文件中的声明不会附加到global对象).

详细说明:

var myObject = { };
myObject.myVariable = 1;
console.log(myObject.myVariable); // logs 1
Run Code Online (Sandbox Code Playgroud)

myVariable 在myObject上创建,这是显式完成的.

var myVariable = 1; // behind the scenes this declerations is doing window.myVariable = 1;
console.log(window.myVariable); // logs 1
Run Code Online (Sandbox Code Playgroud)

myVariable隐式地在window对象上创建,该对象在浏览器的上下文中是全局对象.

我希望这能澄清情况.

为了更好的解释,我强烈推荐这本书系列https://github.com/getify/You-Dont-Know-JS 专门针对这个问题https://github.com/getify/You-Dont-Know-JS/ BLOB /主/范围%20%20closures/README.md#你,不要知-JS-范围-关闭

  • @Griffork我用Chrome v65.0.3325.181和Node v9.9.0对它进行了测试,并且在全局范围内使用`var`分别将该变量附加到`window`和`global`对象. (2认同)
  • 我在控制台中对其进行了测试,我猜这意味着该控制台不是全局范围。这意味着chrome中唯一具有全局作用域的位置是内联脚本标签。也许值得澄清一下? (2认同)
  • @Griffork可以截图吗?控制台不应该这样工作。在控制台中运行此命令时,看不到返回“ 4”吗?`var foobar2 = 4; window.foobar2;`。你的输出是什么?“未定义”? (2认同)