首页 > 代码库 > javascript变量声明和作用域提升
javascript变量声明和作用域提升
以前的知识总是忘,遇到代码又看不懂。要再复习一下,顺便记录一下。
1 add(1,2);2 function add(a,b){3 alert(a+b);4 }
代码能输出3,为什么不是按顺序执行?应该是 //add is not defined ...
javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
也就是说,function add(a,b){alert(a+b)}是一个函数声明,告诉我们有这样一个函数,于是就被提升到作用域最前面了。同样,声明了别的变量也被提升.
上面例子就等于:
1 function add(a,b){2 alert(a+b);3 }4 add(1,2);
注意:只是声明被提升,变量赋值或函数的表达式并没有被提升。
1 alert(a); // undefined2 alert(b); // undefined3 alert(c); // undefined4 5 var a=0,b=1,c=2;
它相当于:
1 var a,b,c2 alert(a);3 alert(b);4 alert(c);5 a=0;6 b=1;7 c=2;
函数也一样:仅仅是var=add被提升,后面的表达式还在原地。
1 (function(){2 add(1,2); //add is not a function3 var add = function(a,b){4 alert(a+b)5 }6 })()
注意:即使给表达式也命名,那也不会被提升
1 (function(){2 add(1,2); //add is not a function3 var add = function add(a,b){4 alert(a+b)5 }6 })()
作用域:
1 var scope="global"; 2 function t(){ 3 console.log(scope); //ubdefined4 var scope="local" 5 console.log(scope); //local6 } 7 t();
var scope="global"; 是全局作用域,在函数里面,又定义了一个局部变量,变量提升。赋值未提升,所以是undefined,后面赋值了就是local
在C++等语言中,凡是有{}括起来的,都有块级作用域,但js没有,有函数作用域
当要调用一个对象时,它会从局部到全局,一个一个找,找到了就不继续找。
1 var name="global"; 2 if(true){ 3 var name="local"; 4 console.log(name) //local5 } 6 console.log(name); //local
if不是函数,没有块级作用域,它的上下文就是全局的。
相当于:
1 var name="global"; 2 var name="local"; 3 if(true){ 4 console.log(name) 5 } 6 console.log(name);
再看这个,从局部到全局,一个一个找,找到了就不继续找。
1 name="lwy"; 2 function t(){ 3 var name="tlwy"; 4 function s(){ 5 var name="slwy"; 6 console.log(name); 7 } 8 function ss(){ 9 console.log(name); 10 } 11 s(); //slwy12 ss(); //tlwy13 } 14 t();
s()先在局部找,找到了var name=‘slwy‘就输出了。
ss()在自己内部没有,就往上找,在t()函数内找,找到了var name=‘tlwy‘,也就输出了。
若没找到,就会继续在全局中找。这样就形成了一个作用域链,在最内部就是链头,没找到就沿着链找,链尾就是全局作用域了。
一个常见的问题,按钮,每次都是弹出最后一个:
1 var aLi = document.getElementsByTagName(‘li‘);2 for(var i = 0; i < aLi.length; i++){3 aLi[i].onclick = function(){4 alert(i); // 每次都弹出最后一个的值5 }6 }
在页面加载完时,这个js函数就运行了,当我们点击时,它会去找i的值,最内部的匿名函数没有,就往上走,在外层找到了i,是4,就输出了4.
解决这方法:
1 for (var i = 0; i < aLi.length; i++) {2 aLi[i].onclick = function (msg) {3 show:function(){4 alert(msg)5 }6 Return show;7 })(i)8 }
1 for (var i = 0; i < aLi.length; i++) {2 (function(i){3 aLi[i].onclick = function () {4 alert(i);5 };6 })(i)7 }
都是将他们保存起来
文章用于学习记录,若有错误,望指正。
javascript变量声明和作用域提升