一. 什么是闭包?
闭包是指可以访问另一个函数作用域中变量的函数。在js中,只有函数内部的子函数才能够读取局部变量。因此可以简单地将闭包理解为: 定义在某个函数中的函数。
二、闭包原理:
上级作用域无法直接访问下级作用域中的变量,但下级作用域可以访问上机作用域中的变量。
例如
function fn1(){
var n = 100;
function fn2(){
console.log(n); //输出100
}
}
function fn1(){
function fn2(){
var n = 100;
}
console.log(n);//会报错
}
函数fn2就是闭包。
三、闭包的作用
让外界读取某个函数内部的变量
让这些变量始终保持在内存中(可能会造成内存泄漏)
- 最基本的作用:可以通过闭包返回的函数或者方法,来修改函数内部的数据
- 创建一个私有的空间,保护数据
四、闭包的基本模型
function fn(){
var data = “1111”;
return function(){
return data;
}
}
var f = fn(); //此时f接收到fn中的匿名函数
var n = f(); //1111
这段代码的特点: 匿名函数嵌套在fn中, fn返回这个匿名函数。函数fn外的变量f引用了函数fn内的匿名函数。
五、关于this指向
- this对象是在运行时基于函数的执行环境绑定的,谁调用this就是谁。如果在全局范围中,this就是window,如果在对象内部,this就指向这个对象。
因为闭包并不属于这个对象的属性或方法。所以在闭包中的this是指向window的
var name = “The window”;
var obj={
name: “The Object”;
getName: function(){
return function(){
return this.name;
}
}
};
var myobj = obj.getName(); //myobj接收到匿名函数 function(){return this.name;
}
Console.log(myobj()); // The Window 相当于 return window.name