1)函数体中的在函数体外不能用
2)如果两个函数使用相同的变量名,只要在函数内部,就不冲突
3)函数成员可以访问函数内部的成员,反之不行
4)假设,内部函数变量和外部函数的变量重名,由内向外查找。
提升变量的作用域
1 function fun() { 2 3 var x = "x" + y; 4 console.log(x); 5 var y = ‘y‘; 6 }
结果:undefined
说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值
1 function fun() { 2 3 var y; 4 var x = "x" + y; 5 console.log(x); 6 y = "y"; 7 }
这个是js在建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护。
1 function fun2() { 2 var x = 1, 3 y = x + 1, 4 z,i,a; 5 6 // 之后随意用 7 }
全局变量
1 x = 1; 2 function f() { 3 console.log(x); 4 } 5 f(); 6 console.log(x);
全局对象window
var x = ‘xxx‘; alert(x); alert(window.x) ;// 默认的全局变量,都会自动绑定在window对象下
alert()这个函数本身也是一个window变量
1 var x = ‘xxx‘; 2 window.alert(x); 3 var old_alert=window.alert; 4 window.alert = function() { 5 6 }; 7 // 发现alert()失效了
js实际上只会有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,拨错refernceError
规范:
由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量,会发生冲突:如何解决冲突?
1 // 唯一全局变量 2 var MyCode = {}; 3 4 // 定义全局变量 5 MyCode .name = "zhangsan"; 6 MyCode .add = function (a, b) { 7 return a + b; 8 }
把自己的代码全部放到自己定义的唯一空间名字中,降低全局命名冲突的问题
jQuery就是这样干
局部变量用let,定义常量用const