10 闭包(读书笔记)

闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。


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,其所占用的内存永远不会被销毁。

发布了1 篇原创文章 · 获赞 1 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章