繁体   English   中英

函数范围和全局变量

[英]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);

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

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

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

http://jsfiddle.net/GbeDX/

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

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

为什么foo === 2在闭包内? [...]据我所知,原始的foo也可以从闭包内部访问。

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

  1. 是。 我的猜测是你在一些调试环境中执行代码,如Firebug,jsFiddle等,它隐式地将代码包装到一个范围内

  2. 您将值2传递给该自执行匿名函数,并通过本地参数foo访问该值。 由于范围链查找总是在底部向上工作 ,因此该变量名称的解析在本地范围停止,其中foo被作为参数找到。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM