闭包的一些

闭包的问题

由于闭包包含之前的执行环境,所以以下的i指向同一个i

function createFunctions(){
	var result = new Array();
	for(var i = 0; i < 10; i++){
		result[i] = function(){
			return i ;
		};
	}
	return result;
}
var fuk = createFunctions();
for (var i = 0; i < fuk.length; i++) {
	console.log(fuk[i]());
}//10 10 10....

解决方式

function createFunctions(){
	var result = new Array();
	for(var i = 0; i < 10; i++){
		result[i] = function(num){
			return function(){
				return num;
			};
		}(i);
	}
	return result;
}
var fuk = createFunctions();
for (var i = 0; i < fuk.length; i++) {
	console.log(fuk[i]());
}//0 1 2....

this对象

匿名函数的执行环境具有全局性,其this对象通常指向window

global.name = "The Window";
var object = {
	name:"My Object",
	getNameFunc:function(){
		return function(){
			return this.name;
		};
	}
}
console.log(object.getNameFunc()());    //The window 在nodejs中的global

访问局部的方法:

global.name = "The Window";
var object = {
	name:"My Object",
	getNameFunc:function(){
		var that = this;
		return function(){
			return that.name;
		};
	}
}
console.log(object.getNameFunc()());

你猜以下
object.getName被赋值了,并且this指针重新指向全局对象了

global.name = "The Window";
var object = {
	name: "My Object",
	getName: function() {
		return this.name;
	}
}
console.log(object.getName());      //My Object
console.log((object.getName)());    //My Object
console.log((object.getName = object.getName)());   //The Window

内存泄漏

如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素无法被销毁

function assignHandler(){
    var element = document.getElementById("someElement");
    element.onclick = function(){
        alert(element.id);
    };
}//循环引用

解决方式

function assignHandler(){
    var element = document.getElementById("someElement");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    };
    element = null;     //如果不能将elemnt设置为null还是不能解决内存泄漏的问题
}
posted @ 2016-05-19 16:35  西鬼  阅读(123)  评论(0编辑  收藏  举报