• 可以将call()和apply()看做是某个对象的方法,通过调用方法的形式来间接调用函数。
  • call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。

以对象o的方法来调用f(),可以这样使用call()和apply()

f.call(o);
f.apply(o);

等同于

o.m = f;    // 将f存储为o的临时方法
o.m(); // 调用它,不传入参数
delete o.m; // 将临时方法删除

在调用方法之前和之后添加日志

// 将对象o中名为m()的方法替换为另一个方法
// 可以在调用原始的方法之前和之后记录日志信息
function trace(o, m) {
var original = o[m]; // 在闭包中保存原始方法
o[m] = function () { // 定义新的方法
console.log(new Date(), "Entering: ", m); // 输出日志信息
var result = original.apply(this, arguments); // 调用原始函数
console.log("result: " + result);
console.log(new Date(), "Exiting: ", m);
return result;
}
} function clazz() {
this.name = "clazz";
this.sayHi = function () {
return "Hi, clazz";
}
} var clazz1 = new clazz();
trace(clazz1, "sayHi");
clazz1.sayHi();

输出结果为:

Sat Jun 23 2018 19:46:46 GMT+0800 (中国标准时间) "Entering: " "sayHi"
result: Hi, clazz
Sat Jun 23 2018 19:46:46 GMT+0800 (中国标准时间) "Exiting: " "sayHi"
  • call 和 apply二者的作用完全一样,只是接受参数的方式不太一样。

apply:

语法:apply(thisObj,数组参数)

定义:应用某一个对象的一个方法,用另一个对象替换当前对象

说明:如果参数不是数组类型的,则会报一个TypeError错误。

call方法:

语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

f.call(o, 1, 2);
f.apply(o, [1, 2]);

参考资料

最新文章

  1. Axure RP 7.0注册码
  2. BaseDao代码,用于连接数据库实行增删改查等操作
  3. SPOJ SUBST1 后缀数组
  4. ASP.NET服务器端事件利用MARQUEE实现正在处理效果
  5. nginx常用场景
  6. cyq.data 常见使用方法
  7. Could not load file or assembly 'System.ValueTuple'
  8. docker容器和本机互传文件
  9. oralce问题
  10. 菜鸡学C语言之摸鱼村村长
  11. Java使用Jedis操作Redis大全
  12. Python之列表
  13. c# 移除文本文件里的某一行
  14. javascript中的回调函数(callback)
  15. C语言 · 周期字串
  16. 为Docker容器中运行的gitlab添加ssh的一些问题记录
  17. AI-Tank
  18. IP、TCP和DNS与HTTP的密切关系
  19. 【BZOJ】1639: [Usaco2007 Mar]Monthly Expense 月度开支(二分)
  20. 解决Centos关闭You have new mail in /var/spool/mail/root提示(转)

热门文章

  1. Daily Scrum 11.10
  2. Dailu Scrum (2015/10/27)
  3. OO前三次作业简单总结
  4. Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流
  5. 词频统计Web工程
  6. vue中的数据双向绑定
  7. php推送
  8. 【Java并发编程】之五:volatile变量修饰符—意料之外的问题
  9. BZOJ5212 ZJOI2018历史(LCT)
  10. #46 delete(动态规划+树状数组)