Call, Apply, Bind
Call, Apply 和 Bind 都能用来改变this的指向。它们之间的区别是:
call 用来明确参数个数确定的情况
apply 用在参数个数不明确的情况
bind 是传递对象
call和apply都会立即执行
bind是创建一个新的函数副本
Call 和 Apply
举例 获取数组中的最大值和最小值
var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(Math, numbers), //458
maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458举例 面试题 定义一个 log 方法,让它可以代理 console.log 方法
function log(){
console.log.apply(console, arguments);
};
log(1); //1
log(1,2); //1 2接下来的要求是给每一个 log 消息添加一个"(app)"的前辍
Bind
bind的定义是,bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
对比
使用举例
三个输出的都是81,但是注意看使用 bind() 方法的,他后面多了对括号。
也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。
实现
Bind
参考链接
ES5 实现
ES6 实现
Call
其中
最终的数组为:
然后
在eval中,args 自动调用 args.toString()方法,eval的效果如 jawil所说,最终的效果相当于:
call 第二种实现方式
Apply
apply 第二种实现方式
最后更新于
这有帮助吗?