首先,让我们看看代码.
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
,因此它引用了全局函数.
归档时间: |
|
查看次数: |
25330 次 |
最近记录: |