函数范围和全局变量

Joh*_*han 5 javascript

var foo = '1',
    bar = '2';

console.log(foo, bar, window.foo); //1, 2, undefined

(function(foo){
    console.log(foo, bar); //2, 2
})(bar);
Run Code Online (Sandbox Code Playgroud)

关于上面的代码我有两个小问题:

  1. 为什么不window.foo定义?默认情况下,并非所有全局变量都附加到窗口对象上吗?

  2. 为什么foo ===2封闭内部?我知道我正在bar使用别名传递原始foo内容2,但是在函数范围之外foo仍然存在1.据我所知,原版foo也可以从封闭内部访问."新foo"是否被优先考虑,因为它作为IIFE的论据被传递?

http://jsfiddle.net/GbeDX/

Fel*_*ing 9

为什么不window.foo定义?不是所有"全局"变量都自动附加到窗口对象上吗?

是的,全局变量成为属性window,但代码不是在您的小提琴中的全局范围内运行.它在load事件处理程序中运行(请参阅左侧的第二个复选框,它显示"onLoad").它在全球范围内运行:http://jsfiddle.net/GbeDX/1/

为什么foo === 2关闭里面?[...]据我所知,原版foo也可以从封闭内部访问.

不,它不能.该参数 foo 隐藏变量foo.如果它是一个全局变量,你可以使用它来访问它window.foo.