js基础 局部变量和全局变量 作用域链 形参是局部变量
局部变量和全局变量
局部变量:在一个作用域(定义域)内定义的变量就是这个作用域内的局部变量。只能在作用域内被访问到。
全局变量:从广义上来看,全局变量也是一种局部变量。全局变量定义在全局,所以也叫全局变量。可以在任何地方都被访问到。
1 // b是在全局内部定义的变量,是全局变量,可以在任何地方访问到 2 var b = 2; 3 function fun(){ 4 // 在函数内部定义的变量是局部变量,只能在该作用域内访问到 5 var a = 1; 6 console.log(a); 7 } 8 fun(); 9 console.log(b); 10 console.log(a); |
变量申明的原理:全局变量,在全局定义之后,会永久存在,任何时候,任何位置访问,都能够找到它。局部变量定义在函数内部的,函数定义的过程,并没有真正的去定义这个局部变量,只有在执行函数的时候,才会立即定义这个局部变量,执行完之后,变量就被立即销毁了,在其他的地方访问变量的时候,找不到这个变量,所以会有一个引用错误,变量未定义。
1.4 作用域链
指的是我们变量查找的一个规律:我们可以在不同的作用域内使用相同的标识符去命名变量。我们在使用一个变量的时候,需要找到匹配的标识符,我们有重复的,用哪一个?如果在当前作用域有这个变量,就直接使用,如果当前作用域没有这个变量定义,会一层一层的从本层往外依次查找,遇到第一个就直接使用。类似于就近原则。
当遇见一个变量时,JS引擎会从其所在的作用域依次向外层查找,查找会在找到第一个匹配的标识符的时候停止。在多层嵌套的作用域中可以定义同名的标识符,发生“遮蔽效应”。
1 // 全局变量 2 var a = 1; 3 function fun1(){ 4 var a = 2; 5 function fun2(){ 6 var a = 3; 7 console.log(a); //因为本层有定义直接输出3 8 function fun3(){ 9 console.log(a); //本身没有a定义,会从本层出发依次向外查找,当找到定义时,直接执行。3 10 } 11 fun3(); 12 } 13 fun2(); 14 } 15 fun1(); 16 console.log(a); //1 |
如果变量声明时,不写var关键字,计算机会自动在全局作用域内给它进行一个声明,局部变量就强制性的变成了全局变量。这种情况是不合理,会造成一个全局变量的污染。所以,定义变量必须写var关键字。
1 var a = 1; 2 // 相当于 3 // var a = 3; 4 function fun1(){ 5 a = 2; 6 function fun2(){ 7 a = 3; 8 console.log(a); //因为本层有定义直接输出3 9 function fun3(){ 10 console.log(a); //本身没有a定义,会从本层出发依次向外查找,当找到定义时,直接执行。3 11 } 12 fun3(); 13 } 14 fun2(); 15 } 16 fun1(); 17 console.log(a); |
1.5 形参是局部变量
形参是局部变量,形参的作用域是它定义的函数的内部。
1 function fun(a){ 2 // 形参是局部变量 3 console.log(a); 4 } 5 fun(1); 6 console.log(a); WEB前端互动交流群 434623999 |