Javascript 函数作用域和全局变量
关于上述代码,我有两个小问题:Javascript 函数作用域和全局变量,javascript,Javascript,关于上述代码,我有两个小问题: 为什么window.foo未定义?默认情况下,不是所有全局变量都附加到窗口对象吗 为什么foo==2在闭包中?我知道我正在传递别名为foo的原始bar,它是2,但在功能范围之外foo仍然是1。据我所知,原始的foo也可以从闭包内部访问。“新食物”作为一个论据被传给生活,它是否被优先考虑 对。我猜您是在一些调试环境(如Firebug、JSFIDLE等)中执行该代码的,这些环境隐式地将该代码封装到一个范围中 将值2传递到该自动执行匿名函数中,然后通过本地参数foo访
window.foo
未定义?默认情况下,不是所有全局变量都附加到窗口对象吗foo==
2在闭包中?我知道我正在传递别名为foo
的原始bar
,它是2
,但在功能范围之外foo
仍然是1
。据我所知,原始的foo
也可以从闭包内部访问。“新食物”作为一个论据被传给生活,它是否被优先考虑2
传递到该自动执行匿名函数中,然后通过本地参数foo
访问该值。由于作用域链查找总是从下到上进行,因此该变量名的解析在本地作用域停止,其中foo
作为参数window.foo
未定义?不是所有“全局”变量都自动附加到窗口对象吗
是的,全局变量成为窗口的属性
,但代码不会在您的小提琴中的全局范围内运行。它在load
事件处理程序中运行(请参见左侧的第二个复选框,它表示“onLoad”)。在这里,它在全局范围内运行:
为什么foo==2
在闭包内部?[…]据我所知,原始的foo
也可以从闭包内部访问
不,不能。参数foo
对变量foo
进行阴影处理。如果它是一个全局变量,您可以使用window.foo
访问它
window.foo==='1'
,除非您在另一个函数中运行此函数foo==='2'
在闭包内部,因为您声明了foo
作为函数的输入参数。如果您没有决定声明具有相同名称的局部范围变量,则可以访问全局范围的foo
foo
视为undefined
,因为您是在firebug或JSFIDLE(相关)等调试环境中运行脚本的foo
覆盖变量foo
。但它仍然是一个全局变量,因此可以将其用作window.foo
问题1-看看小提琴是如何运行的-
onLoad
。问题2-你是对的。foo
参数“覆盖”外部作用域的foo
,但仅覆盖IIFE内部。我想这叫做阴影。因此,您将无法再引用外部的foo
,除非您更改参数名称…或者如果foo
实际上被设置为窗口的属性,谢谢,这正是我想要的。
var foo = '1',
bar = '2';
console.log(foo, bar, window.foo); //1, 2, undefined
(function(foo){
console.log(foo, bar); //2, 2
})(bar);