js抛不开的话题就是这个变量提升了,看了YDKJS关于这个的章节,总结几点。
1.声明提升,赋值不提升,这其实表象来看的结果,其实质如下
alert(foo);
var foo = 1;
比如这两行,结果是undefined,并不是1,就是因为编译器把var foo = 1拆成了两句话,一句var foo,一句foo = 1;
结果变成了
var foo;
alert(foo);
foo = 1;
2.函数提升 > 变量提升
alert(foo());
function foo(){
return 1;
}
var foo = function(){
return 1;
}
按照第一条的理论,还有惯性思维的判断,后声明后后提升,这个看起来应该是undefined,结果其实是1.
3.后声明,后提升
alert(foo());
if(true){
function foo(){ return 1;}
} else {
function foo(){return 2;}
}
这个大家都觉得应该是1吧,其实不是,我们能得出这个结论,是因为我们在看代码是使用的执行视角,但是代码在运行之前要用编译器的视角来完成运行路线,所以在上面那段代码中,编译器会看到两段声明,第二段,覆盖了第一段。
这就是神奇的js语言。
网友评论