闭包1:嵌套的两个作用域中 内层作用域访问外层作用域 局部变量的 过程
闭包2 : 就是能够访问其他函数内部变量的函数;
由于js中只有函数内部的子函数才能访问局部变量,所以可以简单的把闭包理解为"定义在函数内部的函数";
本质上闭包就是连接函数内部和外部的一座桥梁;
闭包的作用:可以让我们利用函数的作用域保存一些我们需要的变量
1.可以解决定时器中无法保存变量的问题 2.节约代码量
闭包特点:延展了函数的作用域 (可以在函数外部读取成员函数内部)
闭包函数不会被轻易释放 (让函数始终存活在内存中)
闭包的缺点: 占用内存
//j定时器 for(var i=0; i<3; i++){ setTimeout(function(){ console.log(i); },0) } // 4 4 4 4
浏览器执行代码顺序: 先执行栈中的代码, 再执行任务队列中的代码
执行栈: script 标签中的代码
任务队列: 定时器中的函数代码 绑定的事件函数代码
所以, 定时器中的代码要等到 for循环完成之后再执行
//闭包中 this 的指向问题
var name = "The Window"; var obj = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; console.log(obj.getNameFun()() ); //the window
//1. 定义变量 that 来存储 this的值
var obj = {
name = 'the pbj',
getNameFunc: function () {
var that = this; return function () { return that.name; }; }
};
console.log(obj.getNameFun()() ); //the obj
//2. 利用bind(this), 将this指向obj
var object = {
name: "My Object",
getNameFunc: function () {
return function () {
return this.name;
}.bind(this);
}
};
console.log(object.getNameFunc()()); //the obj