DaimaRen.cn © 2009-2010 by Tomie Zhang
var o= {
method: function() {
alert(this === o); //true
}
}
o.method();在method被呼叫的时候,tihs指向了o,因为它是o下的一个方法,它的上下文是在o中的,而如果它不在o这个object中,那么它将会指向window:
DaimaRen.cn © 2009-2010 by Tomie Zhang
function method() {
alert(this === window); //true
}
o.method();OK,那接下来要知道call是干什么的,话说call是一个比较奇妙的方法,也很容易让人迷糊,官方的解释:
call 方法
请参阅
应用于:Function 对象
要求
版本 5.5
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
官方解释很容易让人迷糊,Nicholas大湿的解释如下:
The call() method executes a function as if it were a method of another object
那不如看个例子吧:
DaimaRen.cn © 2009-2010 by Tomie Zhang
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1); //4这里其实就是用add的方法替换了sub的方法并且把参数值传进去,等同于
DaimaRen.cn © 2009-2010 by Tomie Zhang
add.call(sub,3,1) == add(3,1)好了,理解了this指针以及call,那回头看这个题目,那它其实就相当于:
DaimaRen.cn © 2009-2010 by Tomie Zhang
function a() {
alert(this);
}
a(null);this不受任何影响指向的是a这个函数声明,而a这个函数声明则是一个object,于是结果就很明显啦。