很多写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最坑人的地方。