Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是';窗口';在javascript中始终位于作用域链的顶部?_Javascript - Fatal编程技术网

是';窗口';在javascript中始终位于作用域链的顶部?

是';窗口';在javascript中始终位于作用域链的顶部?,javascript,Javascript,我见过用window.global\u名称定义的全局变量。 我想知道为什么不使用global_名称,即使这个脚本将在闭包中运行 UPD:IE似乎没有显式地将其添加到window对象中,当您在闭包中声明它时,它们具有类似的效果,但是window允许您显式地声明您有意使用全局对象。否则,读者不知道它是否是作用域链上的var,您只是忘记了声明它,等等。除非您引入另一个作用域,例如,通过将代码包装在函数中,window==this=== 但是,window和此的优点是可以使用数组语法(window['s

我见过用window.global\u名称定义的全局变量。 我想知道为什么不使用global_名称,即使这个脚本将在闭包中运行


UPD:IE似乎没有显式地将其添加到window对象中,当您在闭包中声明它时,它们具有类似的效果,但是
window
允许您显式地声明您有意使用全局对象。否则,读者不知道它是否是作用域链上的
var,您只是忘记了声明它,等等。

除非您引入另一个作用域,例如,通过将代码包装在函数中,
window==this===

但是,
window
的优点是可以使用数组语法(
window['something']
)因此,您可以访问全局变量,即使它们的名称仅在一个字符串中,而无需使用诸如
eval
window之类的邪恶东西。如果当前或之前的作用域中可能存在另一个
x
,则x
比简单的
x
更安全。也就是说,即使是
window
也不是傻瓜,因为您可以定义一个名为
window
的变量,答案是肯定的。如果声明的变量没有
var
关键字(在函数内部),则该变量将隐式成为
窗口
对象的成员,该对象由浏览器自动初始化


在函数外部,无论是否使用
var
关键字,变量都会隐式成为
窗口
对象的成员。

任何ECMAScript环境中作用域链上的最后一个对象始终是全局对象。在浏览器中,
窗口
是全局对象。如果要访问全局对象
x
的属性或全局变量
x
(它们几乎相同,但不完全相同),应使用
window.x
明确限定它,以避免将
x
解析为作用域链上另一个对象的属性,或者
globalObj.x
,如果您关心到非浏览器环境的可移植性。您可以从ECMAScript 3或非严格ECMAScript 5中的任意位置获取对全局对象的引用,如下所示:

var globalObj = (function() { return this; })();

您不能在Firefox或Chrome中重新声明
窗口
。@Matthew Flaschen:
函数x(){var window=10;警报(窗口);}x()警报
10
。对不起,你说得对;您可以在更局部的范围内重新声明它。然而,您不能在全局范围内这样做。简单地说,在JavaScript中,窗口并不总是在范围链的顶端。例如,在服务器端节点应用程序中,根本没有窗口。事件更简单:只有在DOM脚本(即:文档对象模型中的javascript,实际上是浏览器)中,窗口位于作用域链的顶部。Javascript/Ecmascript可以在许多(无窗口)环境中运行