解析js中的call

来源:互联网 发布:阿里云 网站 编辑:程序博客网 时间:2024/05/16 18:17
昨天看到这篇文章 http://uule.iteye.com/blog/1158829

里面讲到call的使用方法,但是作者没有讲清楚里面的关系,我的理解是

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

原作者在这里举例是如下的例子,他的解释是: 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

function Add(a, b) {
alert(this); //输出sub函数
alert(a + b);
}
function sub(a, b) {
alert(this);
alert(a - b);
}
Add.call(sub, 3, 1);

我在两个函数之间加上了alert(this),其实这两个函数Add和sub是属于全局对象的,那么在此Add.call(sub, 3, 1);就相当于Window.Add.call(Window.sub,3,1)。这样就很明显了,call的意思是切换上下文,执行call时,上下文切换至Window.sub,可以用alert(this)来进行调试,上下文虽然切换了,但是还是调用的Window.Add。这样理解就很清楚了。

如果不是很明白,请看下面的例子。

function Animal() {
this.name = "Animal";

this.Say = function () {
alert(this);
alert(this.name);
}
}

function Cat() {
this.name = "Cat";
}

var animal = new Animal();
var cat = new Cat();
animal.Say.call(cat,",");

这里加入了一些alert,便于调试,alert(this);---alert(this.name);这样的执行顺序,调用animal.Say时上下文已经切换到cat对象,所以this就指向的cat,
this.name就等于Cat了。

再回头看上面的,调用Add方法时,上下文切换至Sub方法,然并卵,还是执行的Add方法。原作者的举例不太恰当吧。

 

参考:http://uule.iteye.com/blog/1158829

0 0