Javascript 学习(闭包)
2018-04-13 本文已影响0人
Cats_eat_fish
js闭包
js中的闭包问题是由函数变量的作用域引出的,全局变量和局部变量的概念和Java感觉没有太大的区别,但是如果要在js中实现Java中的私有变量效果,就引出了js闭包。
全局变量
在js中全局变量是指在function外部声明的变量,或者在function内部没有通过var声明的变量;
全局变量的生命周期是全局性的,即:在整个js文件中都可以调用。
例如:
var a = 0;//全局变量
function myfunction(){
b = 0;//全局变量
//这里可以访问a;
return a + b;
}
局部变量
在js中局部变量是指在function内部通过var生命的变量;
局部变量的生命周期是局部性的,也就是只有在其声明的function中才可以调用。
例如:
var a = 0;//全局变量
function myfunction(){
var b = 0;//局部变量
//这里可以访问a
return a + b;
}
//但是在myfunction()外部不能访问b
私有化需求
现在好多地方都会有计数器的需求;
通常我们可以通过定义全局变量的方式来实现;
例如:
var count = 0;
funtion add(){
retutn ++count;
}
这样看着是实现了我们想要的功能,但是这样的话count变量是一个全局变量,所有的function都可以访问这个变量,不安全;
但是局部变量又不能满足我们的需求;
例如:
function add(){
var count = 0;
return ++count;
}
这样每次的返回结果都是1,不是我们想要的;
在js中每个function都可以访问他上一层声明的变量,
例如:
function func1(){
var a = 0;
var b = function (){
//这里可以访问变量a
return a++;
}
//这里调用b() 变量a会增加1;
b();
}
这样把上边的方法简单修改就可以了
例如:
var b = (function (){//function A
var count = 0;
return function(){//function B
return ++count;
}
})();
//每次调用b()count就会增加1后返回
var c = b();
这样最后变的()意思为调用了functionA,即:b依赖的不是functionA 而是functionA的返回值function B,
在需要的地方直接调用b()就可以了
这样count就变成了只有b()能访问到的私有变量了,这就是js中的闭包。