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

时间:2016-10-14 12:55:22

标签: javascript html 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>

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

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

1 个答案:

答案 0 :(得分:5)

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

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

当您使用Node执行javascript时,全局对象非常恰当地命名为global,如果您声明var carName = "Volvo";,则在该环境中您也可以使用global.carName访问该变量(这是仅在nodejs REPL上为true,文件中的var声明不会附加到global对象。)

详细说明:

var myObject = { };
myObject.myVariable = 1;
console.log(myObject.myVariable); // logs 1

myVariable是在myObject上创建的,这是明确完成的。

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

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

我希望这能澄清情况。

为了更好的解释,我强烈推荐这本书系列https://github.com/getify/You-Dont-Know-JS 专门针对这个问题https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/README.md#you-dont-know-js-scope--closures