闭包的一些
闭包的问题
由于闭包包含之前的执行环境,所以以下的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还是不能解决内存泄漏的问题
}