什么是闭包
闭包是函数的代码在运行过程中的一个动态环境,是一个运行期的动态概念。
- 闭包作为与函数成对的数据,在函数执行过程中处于激活状态。
- 闭包在函数运行结束后,保持运行过程的最终数据状态。
函数引用,多个变量可引用同一个函数
function myFun(){
//...
}
var f1 = myFun();
var f2 = myFun();
console.log(f1===f2); //true
下面这种也可以产生同一个函数的引用
var f = function(){
var myFun = function()
{
//...
}
return function(){
return myFun;
}
}()
//其实等价于
var f = function{
//...
}
var f3 = f();
var f4 = f();
console.log(f3===f4); //true
多个函数实例引用,函数实例代码块相同
function MyObject(){
function fun(){
}
this.doFun = fun;
}
var obj1 = new MyObject();
var obj2 = new MyObject();
console.log(obj1.doFun===obj2.doFun); //false 表明是不同的函数实例
console.log(obj1.doFun.toString()===obj2.doFun.toString()); //true
console.log("===========================================");
//以下证明非 new 关键字,也能产生多个函数实例
function myFun(){
function fun(){
}
this.doFun = fun;
}
var obj = new Object();
//1.进入myFun,取 fun 的一个实例
myFun.call(obj);
var f1 = obj.doFun;
//2.再次进入 myFun,取 fun 的一个实例
myFun.call(obj);
console.log(f1===obj.doFun); //false 表明是不同的函数实例
console.log(f1.toString()===obj.doFun.toString()); //true
怎样产生函数实例
闭包是对应用于函数实例的,因此我们只要分析哪些情况下产生函数实例,就可以清楚知道运行的闭包环境
//例一、下面对象的实例支持有原型中的方法的一个引用,因此也不产生函数的实例
function MyObject(){
//...
}
MyObject.prototype.method = function (){
//...
}
var obj1 = new MyObject();
var obj2 = new MyObject();
console.log(obj1.method===obj2.method); //true
//例二、下面对象可以产生函数的实例
function MyObject(){
function fun(){
}
this.doFun = fun;
}
var obj1 = new MyObject();
var obj2 = new MyObject();
console.log(obj1.doFun===obj2.doFun); //false
函数中将内部函数作为返回值也可以产生函数实例
function Fun(){
function myFun(){
//...
}
return myFun;
}
var f1 = Fun();
var f2 = Fun();
console.log(f1===f2); //false