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下的所有方法了。

posted @ 2017-09-25 18:08  puss_in_art  阅读(171)  评论(0编辑  收藏  举报