转载本文请联系三分钟学习前端公众号。Function.prototype.call()call()方法调用具有指定this值和参数(参数列表)的函数。func.call(thisArg,arg1,arg2,...)它运行func,提供第一个参数thisArg作为this和以下参数。看一个简单的例子:functionsayWord(){vartalk=[this.name,'say',this.word].join('');console.log(talk);}varbottle={name:'bottle',word:'hello'};//使用call传递bottle作为sayWord的thissayWord.call(bottle);//bottlesayhello因此call主要实现了以下两个功能:call将this指向bottle并执行sayWord的模拟实现function模拟调用实现call分三步:设置函数为对象的属性执行函数删除对象的属性Function.prototype.call=function(context){//设置函数为属性对象的//注意:在非严格模式下,//指定为null和undefined的this值会自动指向全局对象(浏览器中的window对象)//this值的值为原始值(number,string,Booleanvalue)会指向原值的自动包装对象(ConvertwithObject())context=context?Object(context):window;context.fn=this;//执行函数letargs=[...arguments].slice(1);letresult=context.fn(...args);//删除函数deletecontext。fn//注意:一个函数可以有一个返回值的返回结果;}Function.prototype.apply()apply()方法调用一个给定this值的函数,并作为一个Array(或[array-likeobject])提供的参数。func.apply(thisArg,[argsArray])运行func设置this=context并使用类数组对象args作为参数列表。例如,这两个调用几乎相同:func(1,2,3);func.apply(context,[1,2,3])都在给定参数1,2,3的情况下运行func。但是apply也会设置this=context。call和apply之间唯一的语法区别是call接受一个参数列表,而apply接受一个类似数组的对象。注意:Chrome14和InternetExplorer9仍然不接受类数组对象。如果传入类数组对象,它们会抛出异常。模拟applyFunction.prototype.apply=function(context,arr){context=context?Object(context):window;context.fn=this;letresult;的实现。如果(!arr){result=context.fn();}else{result=context.fn(...arr);}deletecontext.fnreturnresult;}
