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
    也可以从闭包内部访问。“新食物”作为一个论据被传给生活,它是否被优先考虑

  • 对。我猜您是在一些调试环境(如Firebug、JSFIDLE等)中执行该代码的,这些环境隐式地将该代码封装到一个范围中

  • 将值
    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);