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

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

(function(foo){
    console.log(foo, bar); //2, 2
})(bar);

关于上面的代码,我有两个微不足道的问题:

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

  2. 为什么foo ===2 在闭包内?我知道我正在传递bar带有别名的原始foo文件2,但在函数范围之外foo仍然是1. 据我所知,原件foo也可以从封闭件内部访问。“新 foo”是否被优先考虑,因为它作为参数传递给 IIFE?

http://jsfiddle.net/GbeDX/

4

4 回答 4

9

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

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

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

不,它不能。参数 foo 隐藏变量foo。_ 如果它是一个全局变量,您可以使用window.foo.

于 2013-04-25T17:56:27.213 回答
1
  1. 是的。我的猜测是你在一些调试环境(如 Firebug、jsFiddle 等)中执行该代码,这会将该代码隐式包装到一个范围内

  2. 您将值传递给2该自动执行的匿名函数,然后通过本地参数访问该值foo。由于作用域链查找总是在bottom->up中工作,因此对该变量名的解析将在本地作用域停止,该作用域foo是作为参数找到的。

于 2013-04-25T17:56:10.003 回答
1
  1. window.foo === '1', 除非你在另一个函数中运行它。
  2. foo === '2'在闭包内部,因为您声明foo为函数的输入参数。foo如果您尚未决定声明具有相同名称的局部范围变量,则可以访问全局范围。
于 2013-04-25T17:56:41.263 回答
0
  1. 是的。可能您看到该变量fooundefined因为您在诸如 firebug 或 jsfiddle 的调试环境中运行脚本(相关https://stackoverflow.com/a/11572991/975520
  2. 不,参数foo覆盖变量foo。但它仍然是一个全局变量,因此您可以将其用作window.foo.
于 2013-04-25T18:00:03.073 回答