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
posted @ 2017-12-18 11:05  CC大神01  阅读(527)  评论(0编辑  收藏  举报