美文网首页
变量提升的问题hoisting

变量提升的问题hoisting

作者: GeekNiuniu | 来源:发表于2016-04-23 13:02 被阅读0次

    变量提升的问题hoisting

    1.先看一段代码

    var a="you bad bad";

    alert(v);

    可以预见的结果是输出you bad bad

    2.修改一下

    var a="you bad bad";

    (function(){

    alert(a);})()

    弹出的结果是一样的

    3.但是接下来

    var a="you bad bad";

    (function(){

    alert(a);

    var a=" I love you";

    })()

    这个会弹出什么呢?

    这里抛出了一个undefined。这里面就是一个变量提升的问题。

    变量提升顾名思义就是把下面的变量或函数提到程序上面去定义,为了解释提升,我们先看一下js的作用域问题(scoping)。

    1.在我们熟悉的C语言中

    inta =1;

    printf("%d, ", b);// 1

    if(true) {

    inta =2;

    printf("%d, ", a);// 2

    }

    printf("%d\n", a;// 1

    输出的结果将是1,2,1,这是因为在c语言中有块级作用域的概念,在if块中声明的变量,不会影响到外部作用域。

    2.JavaScript中就不是上面的情况了

    var a=1;

    console.log(a);//1

    if(true)

    {

    var a=2;

    console.log(a);//2

    }

    console.log(a);//2

    在这里输出结果是1,2,2.这是尹js中是函数级作用域。只有函数才会创建出新的作用域。

    为了解决上面的问题,我么可以这样写

    functionfoo(){

    vara=1;

    if(true){

    (function(){

    vara=2;

    }());

    }

    console.log(a);//1

    }

    这样就是可以创建一个域不影响其他变量。

    3.变量提升的时候只是提升变量的声明,并不会把赋值也提升。

    看这个例子

    (function(){

    vara='apple;

    varb='pear';

    varc='banana';)

    实际上,它的过程是

    (function(){

    vara,b,c;

    a='apple';

    b='pear';

    c='banana';

    })()

    所以我们最开始那段报出undefined的代码应该是这样的

    vara="you bad bad";

    (function(){

    vara;

    alert(a);

    vara=" I love you";

    })()

    从这里我们可以知道,我们主要把变量放在块级作用域的顶端,即var a;防止出现不希望看见的结果。

    4.刚刚说不仅变量可以提升,函数也可以提升。我们知道在js中,函数有两种写法,一中是函数表达式,一种是函数声明方式,而只有函数声明方式才能被提升。

    函数表达式失败提升:

    functionMy(){

    foo();

    varfoo=functionfoo(){

    alert("you bad bad");

    }

    }

    My();

    函数声明提升成功:

    functionMy(){

    foo();

    functionfoo(){

    alert("you bad bad");

    }

    }

    My();

    相关文章

      网友评论

          本文标题:变量提升的问题hoisting

          本文链接:https://www.haomeiwen.com/subject/sggxrttx.html