javascript变量未定义

Sea*_*ang 10 javascript

首先,让我们看看代码.

var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    var b=1;
}
run();
Run Code Online (Sandbox Code Playgroud)

我认为结果是.01但事实上,结果是0undefined.

然后我修改这段代码.

var a=0;
b=1;
document.write(a);
function run(){
    document.write(this.b); //or document.write(window.b)
    var b=1;
}
run();
Run Code Online (Sandbox Code Playgroud)

是的,这次它按预期运行.01.我无法理解,为什么?

更有趣的是,我再次修改代码.

var a=0;
b=1;
document.write(a);
function run(){
    document.write(b);
    //var b=1;       //I comment this line
}
run();
Run Code Online (Sandbox Code Playgroud)

结果是01.

那么,任何人都能解释一下吗?

感谢您分享您的观点.我简化了这段代码

b=1;
function run(){
    console.log(b); //1
}
Run Code Online (Sandbox Code Playgroud)

二:

b=1;
function run(){
    var b=2;
    console.log(b); //2
}
Run Code Online (Sandbox Code Playgroud)

三:

b=1;
function run(){
    console.log(b); //undefined
    var b=2;
}
Run Code Online (Sandbox Code Playgroud)

nnn*_*nnn 16

当您在函数中引用变量时,JS首先检查该变量是否在当前范围内声明,即在该函数内.如果未找到,则查看包含范围.如果仍未找到,则查找下一个范围,依此类推,直到最终达到全局范围.(请记住,您可以将函数嵌套在彼此内部,这样就可以获得多个级别的包含范围,当然,您的例子当然不会这样做.)

该声明:

b=1;
Run Code Online (Sandbox Code Playgroud)

没有 var声明一个可以在任何函数中访问的全局变量,除了在你的第一个函数中你也声明了一个本地变量b.这称为变量阴影.

"但是",你说,"我在宣布当地b 之后 document.write(b) ".在这里你正在进行声明"吊装".JS解释器处理在函数中任何地方声明的变量,就好像它已经在函数的顶部声明(即,它被"提升"到顶部),但是,任何值赋值都在适当的位置发生.所以你的第一个函数实际执行就像是这样:

function run(){
    var b;              // defaults to undefined
    document.write(b);  // write value of local b
    b=1;                // set value of local b
}
Run Code Online (Sandbox Code Playgroud)

在你使用的第二个函数中this.b,你会发现它this指的是window,全局变量本质上是属性window.所以你正在访问全局b并忽略本地的全局.

在您的第三个函数中,您根本不声明本地b,因此它引用了全局函数.