javascript学习——变量提升和方法(函数)提升

很多写js的都不是很明白变量提升和函数提升(至少我是才知道)。什么是变量和方法提升?

以例子说明:

<script>
    var a = 520;
    fun();
    function fun1(){
        console.log(a);
        var a = 250;
    }
</script>

上面的例子中,我刚开始看的时候以为输出520,我的理解是:有一个全局变量a,而局部变量a还没有执行到,但是结果却出乎意料,竟然是undefined。这是为啥????????

原来javascript语言中,有一个叫做变量和方法提升的东西,这是个什么鬼。

这个鬼就是在浏览器读代码读到<script>标签的时候,它为了提高代码的执行的性能,会先把js代码中的所有变量和方法先加载到js代码的最顶端,然后再一行一行读代码。

例如上面的例子中:

第一步、

        浏览器加载html页面代码,发现有一个script标签,知道这是js代码,于是就先把js文件中所有的变量(var)和方法(fucntion)提升到所有js代码的最前面(全局提全局,局部提局部)。于是就变成了下面的样子。

<script>
    var a;
    function fun1(){
        console.log(a);
        var a = 250;
    }
    a = 520;
    fun();
</script>

第二步、

当把所有的var变量和function方法提升完以后,就开始一行一行的执行js代码了。过程是:声明一个变量a,但是没有赋值----定义一个函数,函数名是fun1--------于是走到函数内部了,这时候就跟刚开始一样,也把里面的变量(var)提升到函数内部最顶端。于是就变成了下面的样子。

<script>
    var a;
    function fun1(){
        var a;
        console.log(a);
        a = 250;
    }
    a = 520;
    fun();
</script>

第三步、

当把函数里面的变量提升完以后,就开始一行一行的执行函数里面的代码了:声明一个局部变量a,但是还没赋值-----打印变量a。结果是undefined。这就是javascript的变量和方法提升(函数和方法其实是一个意思,个别教书中说它们有区别,这是在给自己提名声)。

注意一点的是,变量和方法的提升是只提变量和方法,不提升表达示。

比如:var a = b = c = d;    提升完以后是 

var a;

a = b = c = d;

还有方法的提升:

var fun = function(){};

提升完以后是:

var fun;

fun = function(){};

个人觉得这是js最坑人的地方。

猜你喜欢

转载自blog.csdn.net/xishaoguo/article/details/79564264