call()和apply()的作用

call( )和apply( )都是为了改变某个函数运行时的上下文而存在的.换句话说是改变函数体内部this的指向

他们的区别就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组

来个栗子:

function cat(){};
cat.prototype ={
food:'fish',
say:function(){
alert("I love"+this.food);
}
} var blackCat = new cat();
blackCat.say(); //I love fish //这时有一个新对象
whiteDog = {food:'bone'};
//我们想要它也会说话,但是不想重新定义say方法,我们可以借用cat的方法.
blackCat.say.call(whiteDog);// I love bone

在这个例子中,call改变了blackCat.say()这个函数的运行时的上下文.

call前面的是要执行的函数,第一个参数是目标函数运行上下文.从第二个开始是传入的参数.

至于何为运行时的上下文,我认为指的其实是两个概念,执行环境和变量对象,详情可到"执行环境及作用域"一文中查看.

再来一个例子

function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
} add.call(sub,3,1);//4

这个例子曾经困扰我很久.为什么是4不是2?

敲黑板 : call( )改变的是函数运行时的上下文,上下文,上下文.在这个例子中,不管是函数add还是sub他们的上下文是相同的啊,都是运行在全局作用域下.函数add的上下文并没有被改变,所以该怎么执行还怎么执行喽.

来个用的比较多的,用的比较多的,通过document.getElementsByTagName选择的dom节点是一种类似array的array。它不能应用Array下的push,pop等方法。

我们可以通过var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));这样domNodes就可以应用Array下的所有方法了。

上一篇:【转载】使用Class.getResource和ClassLoader.getResource方法获取文件路径


下一篇:首先看一下友晶DE-SOC开发板的user manual