apply和call
apply和call这两个方法的作用一样,都是控制函数调用上下文即函数体内this值的能力,也就是切换所调用的函数的上下文。
代码如下:
window.color = "red";
document.color = "yellow";
let obj = {
color: "blue"
}
function returnColor(){
console.log(this.color);
}
情况1:apply没有传递值的时候,this默认指向window,因为returnColor调用的上下文是全局==window。(严格模式下,调用函数时如果没有指定上下文对象,则this值是不会指向window。所以,必须在apply()指定给一个对象)
returnColor.apply();
所以我们可以看到控制台打印出来的是red。
情况2:apply传入document,那么this就指向了document。
returnColor.apply(document);
所以我们可以看到控制台打印出来的是yellow。
情况3:apply传入了obj这个对象,那么this就指向了obj。
returnColor.apply(obj);
所以我们可以看到控制台打印出来的是blue。
apply和call的作用一样,只是传参的形式不同:
call传给被调用函数的参数必须是逐个传递的
someFunction.call(this, a1, a2, a3);
apply传给被调用函数的参数是Array的实例
someFunction.apply(this, arr);
二者的第一个参数都是一样,传递被调用函数执行的上下文(this)。
bind
bind方法会创建一个新的函数实例,其this值会绑定到传给bind()的对象。
let obj = {
color: "blue"
}
let test = returnColor.bind(obj);
test();
在控制台中我们可以看到打印了obj对象的color属性值。
总结
一般来说,使用call()或apply()的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关心方法。bind()方法同理。
它们都是为了能够方便设置调用函数的上下文而出现的,也就是控制this的指向,我们可以根据一些情况合理地去利用这些方法。