Javascript中函数天生具有的两个方法

欢欢欢欢 发表于 2014-5-11 03:14

Javascript的函数有两个共同的方法:apply()call()。两个方法的目的是一样的,只是在具体用法有所区别。

这两个方法都调用了函数,并且第一个参数指定了函数体中this所代表的对象。

区别在于apply()的第二个参数是函数调用时的参数,可以是一个数组也可以是一个arguments对象。

 

例子:

function sum(num1, num2){

return num1 + num2;

}

function callSum1(num1, num2){

return sum.apply(this, arguments); //passing in arguments object

}

function callSum2(num1, num2){

return sum.apply(this, [num1, num2]); //passing in array

}

alert(callSum1(10,10)); //20

alert(callSum2(10,10)); //20

 

上面的例子中,callSum1使用了arguments作为第二个参数。callSum2使用了一个数组作为参数参数,这两种使用方法都是有效的。另外,两个函数中的this实际上指向了window对象,因为这两个函数都是在全局中被调用的。

call()的用法和apply()相似,只是在传参的有不同。它的第一个参数还是this,但是剩下的参数会被直接传入参数。也就是说,apply()只会有两个参数,而call()可以有N个参数。

 

例子:

function sum(num1, num2){

return num1 + num2;

}

function callSum(num1, num2){

return sum.call(this, num1, num2);

}

alert(callSum(10,10)); //20

为了达到和最上面的两个方法(callSum1和callSum2)一样的效果,callSum必须将自己的每个参数都传递进call()中作为参数。

具体使用call()还是apply()要取决于具体情况。如果只传第一个参数,call()apply()的效果是一样的。

 

上面介绍了call()apply()的基本用法,下面来说说他们真正强大的地方。

它们真正强大的地方不在于它们传递参数的能力,而在于它们增强了函数体中this的能力。

看下面这个例子:

window.color = “red”;

var o = { color: “blue” };

function sayColor(){

alert(this.color);

}

sayColor(); //red

sayColor.call(this); //red

sayColor.call(window); //red

sayColor.call(o); //blue

sayColor()函数体中使用了this这个关键词,当它在全局范围被单独调用的时候,这个this指的就是window,但是当它通过call()方法被调用的时候,这个this指的就是call()中的第一个参数,因此,当call()中的第一个参数不一样的时候,函数体中this所指向的对象就不一样,造成的结果也就不一样,因此增强了函数的使用方式和开发者的遐想空间。