您的位置:首页 > Web前端 > JavaScript

JavaScript 函数中的call和apply方法

2019-07-13 15:32 537 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/JUSTchanhy/article/details/95751162

JavaScript 函数的call和apply方法

鉴于

JavaScript
中函数的特殊性,我们可以把函数看作是特殊的对象,因此可以将
call
apply
看作是某个对象的方法,通过调用对象方法的形式简洁调用函数。

call
apply
的第一个参数是要调用函数的母对象,他就是调用函数的上下文,在所要调用函数的内部,我们可以使用
this
关键字获取对传入的第一个对象的饮用。

function func1(){
this.func();
}
var o ={};
o.func = function (){
console.log("Called by o.");
}
var b ={};
b.func = function (){
console.log("Called by b.");
}
func1.call(o);
//Called by o.
func1.apply(b);
//Called by b.

ECMAScript 5
的严格模式中,
call
apply
的第一个实参都会变成
this
的值——
this
就是第一个实参,哪怕传入的第一个参数是
null
或者
undefined

而在
ECMAScript 3
和非严格模式中,传入的
null
undefined
都会被被全局对象所取代

function a(){
console.log(this);
}
a.call(null);
//window.xx

call
来说,第一个调用上下文实参之后的所有实参都是要传入所要调用的函数的参数的值。以对象
obj
的方法调用
func
函数,可以用下面的形式:

/* obj是对象, params是相关参数,可能有多个 */
func.call(obj, parmas);

apply
call
稍有不同,出了第一个参数相同之外, 其余的参数以数组的形式传入,例如:

var obj = {};
obj.func = (args) => {
var sum=0;
return args.reduce((x, y) => {return x+y},0);
}
buffer=[1,2,3,4];
func.apply(obj, buffer);
//10
function func(){
this.func(buffer);
}

注意,

apply
的第二个参数出了可以传递数组还可以传入类数组对象,例如函数中的
arguments

function trace(o,m){
var original = o[m];
o[m] = function(){
console.log(new Date(),"Entering: ",m);
var ret = original.apply(this,arguments);
//这里的this指向对象o
//this==o :true
console.log(new Date(),"Exiting: ",m);
return ret;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: