闭包是当函数在其他地方使用的时候能保存下函数所需要的运行环境,也即是函数能保存下函数诞生时的环境。闭包会包含它所在的函数作用域。如:
function createFunc(name) {
return function(obj1, obj2){
var val1 = obj1[name];
var val2 = obj2[name];
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 1;
}
}
}
作用域链
当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后,使用arguments和其他命名参数的值来初始化函数的活动对象。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,直到作为作用域链终点的全局执行环境。
闭包中的this
this对象在运行时基于函数的执行环境绑定的;在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。匿名函数的执行环境具有全局性,因此this对象通常指向window。但闭包中的this则不一样。
每个函数在被调用时会自动获取this,arguments。内部函数在搜索过着两个变量时,只会搜索其活动对象为止,因此不可能之间访问外部函数中的这两个变量。我们可以把外部的this对象保存到一个变量中访问。 如:
var name = 'window';
var obj = {
name: 'obj',
getName: function(){
var that = this;
return function() {
return that.name;
}
}
}
obj.getName()() // obj;
arguments也存在与this同样的问题,我们也必须通过定义一个变量来访问
如有侵权,请发邮箱至wk_daxiangmubu@163.com 或留言,本人会在第一时间与您联系,谢谢!!