我们知道,this对象是在运行时基于函数的执行环境绑定的。
1:在全局函数中,this等于windows。
2:而当函数作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。
举个栗子:
var name = 'the window';
var obj = {
name: 'my obj';
getNameFunc: function(){
return function(){
return this.name;
};
}
}
alert(obj.getNameFunc()()); //the window
运行代码后发现结果为the window,这就说明this的指向为全局。那为什么呢?我的理解是:当执行obj.getNameFunc()()时会立即调用getNameFunc的返回函数。它返回一个匿名函数,匿名函数又返回this.window。而在上面已经说过了,匿名函数的this指向window。所以结果也就不言而喻了。
那么,如果想要拿到局部的name该怎么实现呢?我们可以把this保存在一个闭包可以访问到的变量里面。
延续上面的栗子实现:
var name = 'the window';
var obj = {
name: 'my obj';
getNameFunc: function(){
var that = this;
return function(){
return that.name;
};
}
}
alert(obj.getNameFunc()()); //my obj
该代码与第一个的区别在于:在定义匿名函数之前,我们把this对象赋值给了一个名叫that的变量。而在定义了闭包之后,闭包也可以访问这个变量,因为它时我们在包含函数中特意声明的一个变量。
3:apply调用:apply()时函数对象的一种方法,它的作用时改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。apply()的参数为空时,默认调用全局变量。
举个栗子:
var numbres = [23,5,6,8];
var max = Math.max.apply(Math,numbers);
该代码可以用于查询numbers数组中的最大值。numbers本身没有max方法,但是Math有,所以我们就可以借助apply改变调用该函数的对象,最终实现效果。