JS Function: apply vs call vs bind
Posted hiveer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS Function: apply vs call vs bind相关的知识,希望对你有一定的参考价值。
Function 构造函数中有三个方法可以改变函数实例中的this
,今天面试的时候被问到了,懵逼了!今天专门研究了下,发现了一篇不错的文章,半翻译,半理解写在这里。
原文
https://medium.com/@leonardob...
Function.prototype.call()
call
允许你调用一个函数,并且在首个参数传入this
。然后函数的参数一个一个以逗号分隔,依次传入。
例子:
function greeting(text1, text2) {
console.log(`${text1} ${this.name}, ${text2}`);
}
let customer1 = { name: \'Leo\', email: \'leo@gmail.com\' };
let customer2 = { name: \'Nat\', email: \'nat@hotmail.com\' };
greeting.call(customer1, \'Hello\', \'good morning!\');
// > Hello Leo, good morning!
greeting.call(customer2, \'Hello\', \'good afternoon!\');
// > Hello Nat, good afternoon!
Function.prototype.apply()
这个方法跟call
的功能很类似,但是实现方式不太一样。依然是第一个参数传入this
,但是被调用的函数的参数会以数组的形式作为apply
方法的第二个参数传入。
例子:
function greeting(text1, text2) {
console.log(`${text1} ${this.name}, ${text2}`);
}
let customer1 = { name: \'Leo\', email: \'leo@gmail.com\' };
let customer2 = { name: \'Nat\', email: \'nat@hotmail.com\' };
greeting.apply(customer1, [\'Hello\', \'How are you?\']);
// > Hello Leo, How are you?
greeting.apply(customer2, [\'Hello\', \'How are you?\']);
// > Hello Natm How are you?
Function.prototype.bind()
这个方法跟call
和apply
很不一样,它不是去调用一个函数,而是根据已有的函数创造了一个新的函数,这个新的函数的this
可以在bind
参数传入。也就是说新造函数无论什么时候执行,它的this
都是固定的。
函数定义:
Function.prototype.bind = function(context) {
var fn = this;
return function() {
fn.apply(context, arguments);
};
};
这段代码是bind
函数的定义,从var fn = this
可以知道,fn
指向了调用bind
函数的函数对象。然后在bind
的返回函数fn.apply(context, arguments)
可以看出,哪个函数调用了bind
,那么bind
就把这个函数的this
改变为context
。
例子:
function greeting(text) {
console.log(`${text} ${this.name}`);
}
let customer1 = { name: \'Leo\', email: \'leo@gmail.com\' };
let customer2 = { name: \'Nat\', email: \'nat@hotmail.com\' };
let helloLeo = greeting.bind(customer1);
let helloNat = greeting.bind(customer2);
helloLeo(\'Hello\');
// Hello Leo
helloNat(\'Hello\');
// Hello Nat
希望能帮助到你!
以上是关于JS Function: apply vs call vs bind的主要内容,如果未能解决你的问题,请参考以下文章
[Compose] 16. Apply multiple functors as arguments to a function (Applicatives)