10 闭包(读书笔记)

时间:2022-02-18 22:41:11
闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。


function createComparisonFunction(propertyName){
return function(obj1,obj2){
var value1 = obj1[propertyName];
var value2 = obj2[propertyName];
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}
}
var compare = createComparisonFunction("name");
var result = compare({name:"Leon"},{name:"Dae"});
compare = null;


创建函数,这一步createComparisonFunction执行结束,但是返回一个内部的匿名函数,这个匿名函数持有createComparisonFunction的活动对象
var compare = createComparisonFunction("name");
调用函数,
var result = compare({name:"Leon"},{name:"Dae"});
//解除对匿名函数的引用
compare = null;


匿名函数从createComparisonFunction中返回后,它的作用域链被初始化为包含createComparisonFunction函数的活动对象和全局变量对象,这样匿名函数就能访问所有createComparisonFunction中定义的变量,createComparisonFunction结束后,因为匿名函数的作用域链仍然在引用这个活动对象因此createComparisonFunction的活动对象不会被销毁,这个活动对象会存在内存中知道匿名函数被销毁。


1.闭包与变量
闭包只能取得包含函数中任何变量的最后一个值
function createFunctions(){
var result = new Array;
for(var i=0;i<10;i++){
result[i] = function(){
return i;
}
}
return result;
}
var funcs = createFuctions();
for(var i=0;i<funs.length;i++){
alert(funcs[i]);
}

全部是10,因为每个函数的作用域都保存着createFunctions的活动对象,所以它们引用的是同一个变量i,当createFunctions结束后,变量i的值是10.

2.this对象
this是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,当函数作为某个对象的方法调用时,this等于那个对象,但匿名函数的执行环境具有全局性,因此this对象通常指向window。
var name = "The window";
var object ={
name:"MyObject",
getNameFunc:function{
return function(){
return this.name;
};
}
};

object.getNameFunc()();//The window




var name = "The window";
var object ={
name:"MyObject",
getNameFunc:function{
var that = this;
return function(){
return that.name;
};
}
};
object.getNameFunc()();//MyObject


3.内存泄露
function assignHandler(){
var element = document.getElementById(id);
element.onClick = function(){
alert(element.id);
};
}
由于匿名函数保存了对assighHandler的活动对象的引用因此只要匿名函数存在,element的引用数至少是1,其所占用的内存永远不会被销毁。