JavaScript闭包,以及使用的场景
阮一峰说闭包:“我的理解是,闭包就是能够读取其他函数内部变量的函数。”;
官方解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分;
朴实直观解释是:A函数中嵌套着B函数,B程序中有用到A的变量,当外部函数C调用函数A时,虽然A已经执行完毕,理论上函数执行完毕,它就要被弹出栈,但是由于B要用到A,所以A的变量被保存到内存中不被销毁,我们称函数B是闭包。
使用场景:
- 采用函数引用方式的setTimeout调用 funcion acc(){ this.time = setTimeout(funtion(){},500) }()
- 小范围代替全局变量 一个函数里声明了一个变量,函数之前嵌套使用, 函数外无法访问内部变量(可以防止污染其他变量)
在《js高级程序设计中》,有段代码:
(function A(){
var array1=[];
for(var i=0;i<5;i++){
array1[i]=function (){return i; (闭包产生的地方)
}}
for(j=0;j<5;j++){
console.log( array1 [j] ());}
})() //5 5 5 5 5
如何产生 1.2.3.4.5 的打印值呢,去掉闭包就行(内部函数不要使用外部外部变量)(function A(){
var array1=[];
for(var i=0;i<5;i++){
array1[i]=function(num){return function(){
return num;}}(i);}
for(var j=0;j<5;j++){
console.log(array1[j]());
}})() // 0 1 2 3 4 立即调用函数
function foo() {/*...*/} // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。 foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。
function foo() {/*...*/}() 相当于 foo() 是一个IIFE立即执行函数 去除闭包的一个有效方法(function(){}())与(function(){})()
这两种写法,都是一种
立即执行函数的写法,即IIFE (Immediately Invoked Function Expression)。这种函数在函数定义的地方就直接执行了。 - 访问私有变量的特权方法 通过构造函数创建对象 (使用this关键字,或者var声明一个变量)
var obj = function (){
this.name ='张三';
this.age = 19; //var age = 19
this.getAge = function (){
return this.age; // age
};
this.setAge = function(value){
this.age = value; // age = value
};};
console.log(person.getAge()) // 19
var person = new obj()
console.log(person.setAge(50))
console.log(person.getAge()) // 50

浙公网安备 33010602011771号