我有this code in a fiddle:

var a = 1;

function b() {
    var a = 10;
    alert(window.a);
}

b();

为什么a在这里未定义?它已经在全局 namespace 即window中定义。 (有关此意外行为的示例,请参见the fiddle。)

最佳答案

如果您在未将位置设置为“不自动换行”的小提琴中运行此代码,或者在任何不在顶级范围内的情况下运行此代码,则外部a而不是全局变量window.a 。考虑一个简单的示例,其中将代码包装在一个名为wrappingFunc的函数内:

// THIS would be the global `a`, outside `wrappingFunc`
var a = "now the global a is defined";

function wrappingFunc() {
    // this is NOT the global `a`
    var a = 1;

    function b() {
        var a = 10;
        alert(window.a);
    }

    b();
}

wrappingFunc();

当您将位置设置为onLoadonDomready时,JSFiddle正是这样做的。 (请参阅What is the difference between onLoad, onDomready, No wrap - in <head>, and No wrap - in <body>?)我的wrappingFunc示例实际上是onloadondomready侦听器函数,它阻止了keep在全局上下文中运行。

10-05 20:57