JavaScript——变量作用域
在JavaScript中,var定义变量实际是有作用域的。
假设在函数中声明,则在函数体外不可以使用~ (硬要实现可以使用 闭包 )
1 function qwe(){ 2 var x=1; 3 x = x+1; 4 } 5 x = x+2; //报错输出 Uncaught ReferenceError:x is not defined
如果两个函数使用了相同的变量名,只要在函数内部就不冲突!
1 function qwe(){ 2 var x=1; 3 x = x+1; 4 } 5 6 function qwe2(){ 7 var x=1; 8 x = x+1; 9 }
内部函数可以访问外部函数的成员,反之则不行
1 function qwe(){ 2 var x=1; 3 4 //内部函数可以访问外部函数成员,反之则不行! 5 function qwe2(){ 6 var y=x+1; // 2 7 } 8 9 var z = y+1; // 报错 Uncaught ReferenceError:x is not defined 10 }
假设,内部函数变量和外部函数变量重名!
1 function qwe(){ 2 var x=1; 3 4 //内部函数可以访问外部函数成员,反之则不行! 5 function qwe2(){ 6 var x=2; 7 console.log('inner'+x); //输出outer1 8 } 9 console.log('outer'+x); //输出inner2 10 qwe2() 11 } 12 qwe()
假设在JavaScript中函数查找变量从自身函数开始~,由“内”向“外”查找,假设外部存在这个同名的函数变
量,则内部函数会屏蔽外部函数的变量。
提升变量作用域
1 function qwe(){ 2 var x="x"+y; 3 console.log(x); 4 var y='y'; 5 } 6 qwe()
结果为:xundefined
说明:js执行引擎,自动提升了y的声明,但不会提升变量y的赋值;
1 function qwe2(){ 2 var y; 3 4 var x="x"+y; 5 console.log(x); 6 y='y'; 7 }
这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,
便于代码维护!
1 function qwe2(){ 2 var x=1, 3 y=x+1, 4 z,i,a; //undefined 5 6 //之后随意使用 7 }
全局函数
1 //全局变量 2 x = 1; 3 4 function f(){ 5 console.log(x); 6 } 7 f() 8 console.log(x);
全局对象window
1 var x='哈哈'; 2 alert(x); 3 alert(window.x); //默认所有的全局变量,都会自动绑定在window下;
alert()这个函数本身也是一个 window 变量 ;
1 var x='xxx'; 2 window.alert(x); //xxx 3 4 var old_alert=window.alert; 5 old_alert(x); //xxx 6 7 window.alert=function(){ 8 9 }; 10 //发现alert()无效 11 window.alert(123); 12 13 //恢复 14 window.alert=old_alert; 15 window.alert(456); //456
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错:‘RefrenceError' 。
1 window.alert(x);
规范
由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件使用了相同的全局变量,如何减少冲突 ?
1 //唯一全局变量 2 var clApp={}; 3 4 //定义全局变量 5 clApp.name='cl'; 6 clApp.add=function(a,b){ 7 return a+b; 8 }
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题
jQuery
局部作用域 let
1 function aaa(){ 2 for (var i=0;i<100;i++){ 3 console.log(i); //99 4 } 5 console.log(i+1); //101 6 } 7 aaa()
ES6 let关键字,解决局部作用域冲突
1 function aaa(){ 2 for (let i=0;i<100;i++){ 3 console.log(i); 4 } 5 console.log(i+1); //Uncaught ReferenceRrror: i is not defined 6 } 7 aaa()
建议大家都是使用 let 去定义局部作用域的变量 !
常量 const
在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值
1 var PI='3.14'; 2 console.log(PI); 3 PI='134'; //可以改变这个值 4 console.log(PI);
在ES6引入常量关键字 const
1 const PI='3.14';//只读取变量,改变不了 2 console.log(PI); //3.14. 3 PI='134'; //报错:TypeError: Assignment to constant variable. 4 console.log(PI);