有关Js作用域声明提升

2017-04-30  本文已影响14人  KittyKnight

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语言。

上一篇 下一篇

猜你喜欢

热点阅读