JavaScript中的apply()和call()
- 可以将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]);
参考资料
- 《JavaScript权威指南》第六版
 - JS中的apply,call,bind深入理解
 
JavaScript中的apply()和call()的更多相关文章
- javascript中call,apply,bind的用法对比分析
		
这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习java ...
 - JavaScript中的apply和call函数详解(转)
		
每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,J ...
 - JavaScript中call,apply和prototype
		
[TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...
 - JavaScript中的apply和call函数详解
		
本文是翻译Function.apply and Function.call in JavaScript,希望对大家有所帮助 转自“http://www.jb51.net/article/52416.h ...
 - javascript中的apply,call,bind详解
		
apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...
 - Javascript中的apply、call、bind
		
apply . call .bind 三者都是用来改变函数的this对象的指向的: apply . call .bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文: apply . ...
 - javascript中bind,apply,call的相同和不同之处
		
javasctipt中bind,apply,call的相同点是: 1,都是用来改变this的指向; 2,都可以通过后续参数进行传参; 3,第一个参数都是指定this要指向的对象; 不同点: 1,调用方 ...
 - JavaScript中的apply,call与this的纠缠
		
1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...
 - Javascript中的apply与call详解
		
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.arg ...
 
随机推荐
- String   类  的 使用
			
package com.StringUse; import java.util.Arrays; /* String 的构造方法: String() 创建一个空内容 的字符串对象. String(byt ...
 - 团队作业4--第一项目冲刺3(Aplpha)
			
1.会议 第三次会议: ①:总结前两天出现的问题 ②:总结前端学习的心得 ③:安排后两天任务 2.任务安排 3.任务分解图 4.燃尽图 5.适当的项目程序/模块的最新(运行)截图 6.心得 组员之间要 ...
 - 05_Java基础语法_第5天(方法)_讲义
			
今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 * ...
 - raise PDFEncryptionError('Unknown algorithm: param=%r' % param)  pdfminer.pdfdocument.PDFEncryptionError: Unknown algorithm
			
使用pdfminer遇到的pdf文件加密问题: raise PDFEncryptionError('Unknown algorithm: param=%r' % param) pdfminer.pdf ...
 - c# Parallel 并行运算 异步处理
			
var list = new List<string> { "https://www.baidu.com","https://associates.amazo ...
 - selenium 关键字驱动部分设计思路
			
1 说明: 1.以下的代码亲测直接可用, 2.设计思路来自博客园的 张飞_ :http://www.cnblogs.com/zhangfei/p/5330994.html / http://w ...
 - Centos7 FPM 安装mysql8
			
参考http://tn.51cto.com/article/647 http://www.jb51.net/article/138787.htm 转载: 卸载centos自带的mariadb rpm ...
 - python调用Sikuliapi
			
Sikuli是由MIT(麻省理工学院) 研究团队发布的一种图形化编程技术(编程小白的福音),使用Sikuli你只需要会写HelloWorld这种最基本的编程技能即可,用Sikuli不需要去写出一行行复 ...
 - [转帖]从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路
			
从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路 http://www.52im.net/thread-1709-1-2.html 本文原作者阮一峰,作者博客:r ...
 - T4扩展程序
			
T4功能强大,不用简直就是浪费青春.vs是没有自带对T4模板编辑的扩展的,写着很累很累(我很low我承认) 这两个驯兽师能帮你驯服它 Devart T4 Editor T4 Toolbox