查看: 655|回复: 0

[JavaScript/JQuery] 爱创课堂 前端 js基础 全局变量的应用 函数的作用域 闭包

发表于 2017-11-24 09:43:07
1.6 全局变量的应用①传递:全局变量可以在不同函数间通信。(相当于信号量)
不同的函数同时控制我们的全局变量。全部变量不会重置也不会清空。

1 // 定义一个全局变量
2 var a = 1;
3 // 定义一个自加的函数
4 function jia(){
5 console.log(++a);
6 }
7
8 // 定义一个自减函数
9 function jian(){
10 console.log(--a);
11 }
12
13 jia();   //2
14 jia();   //3
15 jia();   //4
16 jian();  //3
17 jian();  //2
18 jian();  //1
19 jia();   //2


②同一个函数不同调用。累加:全局变量的值,不会被重置、清空。

1 //全局变量,不会让变量重置,或者清空
2 var a = 1;
3 function jia(){
4 a += 4;
5 console.log(a);
6 }
7
8
9 // 调用
10 jia();  //5
11 jia();  //9
12 jia();  //13

1.7 函数的作用域函数作用域和变量类似,也是只能在函数声明的地方使用,外部任何地方都不能访问。

1 function outer(){
2 function inner(){
3 console.log(1);
4 }
5 inner();
6 }
7 outer();
8 inner();      //不能再outer的外部调用inner

1.8 闭包体会闭包:

1 function outer(){
2 var a = 1;
3 function inner(){
4 console.log(a);
5 }
6 return inner;  //没有小括号,表示只输出inner函数的定义,不会立即执行
7 }
8 // console.log(outer());
9 var i = outer();
10 // i内部存储的是inner函数的地址。
11 i();
12 // 本层没有a的定义,但是inner的作用域链存在.
13 // 所以输出1

总结:inner函数把它自己内部的语句,和自己声明时所处的作用域一起封装成了一个密闭环境,我们称为“闭包”。
闭包是天生存在的,并不是我们通过某种方法做出来的。


函数本身就是一个闭包。函数定义的时候,就能记住它的外部环境和内部语句,每次执行都会参考定义时的密闭环境。


案例1:

1 // 案例1
2 function outer(x){
3 function inner(y){
4 console.log(x + y);
5 }
6 return inner;
7 }
8 var i = outer(3);
9 // i = function inner(y){
10 // console.log(3+y);
11 // }
12 i(5);
13 i(7);

说明:初始定义inner函数的时候,是在out(3)执行时,所以x记住了一个3的值。

闭包天生存在,并不需要什么特殊的结构才存在,只不过我们必须要刻意地把函数放到其他的作用域中调用,才能明显的观察到闭包性质。

案例2:
1 function outer(x,y){
2 function inner(x){
3 console.log(x + y);
4 }
5 return inner;
6 }
7
8 var i = outer(2,3);
9 // inner的外部环境
10 // y = 3;
11 // i = function inner(x){
12 // console.log(x + y);
13 // }
14 i(5);
15 //8

案例3:
1 function outer(){
2 var i = 1;
3 function inner(){
4 return i++;
5 }
6 return inner;
7 }
8 var i = outer();
9 console.log(i());
10 console.log(i());
11 console.log(i());

结论:函数的闭包,记住了定义时所在的作用域,这个作用域中的变量不是一成不变的。

1 function outer(){
2 var i = 1;
3 function inner(){
4 return i++;
5 }
6 return inner;
7 }
8 var i = outer();
9 var inn = outer();
10
11 console.log(i());  
12 console.log(inn());
13 console.log(inn());
14 console.log(inn());
15 console.log(i());
16 console.log(i());
17 console.log(i());

结论:我们可以认为,每次调用一个函数,都会产生新的闭包。新的闭包是指,语句全新,所处环境也是全新的。

本文章版权归爱创课堂所有,转载请注明出处。

更多详细内容请访问爱创课堂官网首页

http://www.icketang.com/




回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条