[英]Function scopes and global variables
var foo = '1',
bar = '2';
console.log(foo, bar, window.foo); //1, 2, undefined
(function(foo){
console.log(foo, bar); //2, 2
})(bar);
关于上面的代码我有两个小问题:
为什么window.foo
未定义? 默认情况下,并非所有全局变量都附加到窗口对象上吗?
为什么foo ===
2在闭包内? 我知道我正在传递带有别名foo
的原始bar
,它是2
,但在函数范围之外foo
仍然是1
。 据我所知,原始的foo
也可以从闭包内部访问。 “新foo”是否被优先考虑,因为它作为IIFE的论据被传递?
为什么
window.foo
未定义? 不是所有“全局”变量都自动附加到窗口对象上吗?
是的,全局变量成为window
属性,但代码不是在小提琴中的全局范围内运行。 它在load
事件处理程序中运行(请参阅左侧的第二个复选框,它显示“onLoad”)。 它在全球范围内运行: http : //jsfiddle.net/GbeDX/1/
为什么
foo === 2
在闭包内? [...]据我所知,原始的foo
也可以从闭包内部访问。
不,它不能。 参数 foo
隐藏变量foo
。 如果它是一个全局变量,你可以使用window.foo
访问它。
是。 我的猜测是你在一些调试环境中执行代码,如Firebug,jsFiddle等,它隐式地将代码包装到一个范围内
您将值2
传递给该自执行匿名函数,并通过本地参数foo
访问该值。 由于范围链查找总是在底部向上工作 ,因此该变量名称的解析在本地范围停止,其中foo
被作为参数找到。
window.foo === '1'
,除非你在另一个函数中运行它。 foo === '2'
在闭包内部因为你声明foo
作为函数的输入参数。 如果您尚未决定声明具有相同名称的本地范围变量,则可以访问全局范围的foo
。 foo
是undefined
因为你在调试环境中运行你的脚本,如firebug或jsfiddle(相关的https://stackoverflow.com/a/11572991/975520 ) foo
覆盖变量foo
。 但它仍然是一个全局变量,所以你可以将它用作window.foo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.