首先,让我们看看代码。
var a=0;
b=1;
document.write(a);
function run(){
document.write(b);
var b=1;
}
run();我认为结果是01,.but,实际上,结果是0undefined。
然后我修改了这段代码。
var a=0;
b=1;
document.write(a);
function run(){
document.write(this.b); //or document.write(window.b)
var b=1;
}
run();是的,这一次它像预期的那样运行。01。我不明白,为什么?
更有趣的是,我再次修改了代码。
var a=0;
b=1;
document.write(a);
function run(){
document.write(b);
//var b=1; //I comment this line
}
run();结果是01。
那么,有没有人能解释一下?
感谢分享你的观点。我简化了这段代码
b=1;
function run(){
console.log(b); //1
}二:
b=1;
function run(){
var b=2;
console.log(b); //2
}三:
b=1;
function run(){
console.log(b); //undefined
var b=2;
}发布于 2012-08-15 10:30:34
当您在函数中引用变量时,JS首先检查该变量是否在当前作用域中声明,即在该函数中声明。如果未找到,则在包含范围内查找。如果仍未找到,它将在下一个作用域中向上查找,依此类推,直到最终到达全局作用域。(请记住,您可以将函数相互嵌套,这就是如何获得多个级别的包含作用域的方法,当然您的示例不会这样做。)
声明:
b=1;如果不使用var,则会声明一个全局变量,该变量可在任何函数中访问,除非在第一个函数中还声明了一个局部b。这称为variable shadowing。
“但是”,您会说,“我在document.write(b)之后声明本地b”。在这里,你遇到了声明“提升”。JS解释器将函数中任何位置声明的变量视为在函数顶部声明的变量(即,它被“提升”到顶部),但是,任何赋值都会在适当的位置发生。所以你的第一个函数实际上是这样执行的:
function run(){
var b; // defaults to undefined
document.write(b); // write value of local b
b=1; // set value of local b
}在使用this.b的第二个函数中,您会发现this引用了window,而全局变量本质上是window的属性。因此,您正在访问全局b,而忽略了本地are。
在您的第三个函数中,您根本没有声明一个本地b,所以它引用了全局all。
https://stackoverflow.com/questions/11963240
复制相似问题