js基础 局部变量和全局变量 作用域链 形参是局部变量

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);

800?pt=0&ek=1&kp=1&sce=0-12-12
变量申明的原理:全局变量,在全局定义之后,会永久存在,任何时候,任何位置访问,都能够找到它。局部变量定义在函数内部的,函数定义的过程,并没有真正的去定义这个局部变量,只有在执行函数的时候,才会立即定义这个局部变量,执行完之后,变量就被立即销毁了,在其他的地方访问变量的时候,找不到这个变量,所以会有一个引用错误,变量未定义。

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

800?pt=0&ek=1&kp=1&sce=0-12-12
如果变量声明时,不写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);

800?pt=0&ek=1&kp=1&sce=0-12-12

1.5 形参是局部变量

形参是局部变量,形参的作用域是它定义的函数的内部。
 

1 function fun(a){
2 // 形参是局部变量
3 console.log(a);
4 }
5 fun(1);
6 console.log(a);

WEB前端互动交流群 434623999

转载于:https://my.oschina.net/u/3709170/blog/1591326

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值