返回

call、apply、bind 三剑客,转动你的this!

前端

在 JavaScript 中,call、apply、bind 三兄弟有着举足轻重的地位,它们掌管着函数运行时this指向的分配,堪称this指向的“操盘手”。今天,我们就来一探究竟,深入了解它们是如何运作的!

拆解call、apply、bind的奥秘

    call、apply、bind这三个函数都有一个共同点:它们都可以改变函数运行时的this指向。但是,它们的使用方式略有不同。
  1. call(thisArg, arg1, arg2, ...):
    call方法接收两个或多个参数。第一个参数是想要指定为this的新值,而后续的参数则是要传递给函数的实际参数。

  2. apply(thisArg, [args]):
    apply方法也接收两个或多个参数。第一个参数是想要指定为this的新值,而第二个参数是一个数组,其中包含了要传递给函数的实际参数。

  3. bind(thisArg, arg1, arg2, ...):
    bind方法与call和apply相似,但它不会立即执行函数。相反,它返回一个新的函数,该函数的this值已经被绑定为指定的thisArg。

活用call、apply、bind的场景

    掌握了call、apply、bind的基本用法后,我们就可以在实际开发中大展拳脚了。以下是一些常见的应用场景:
  • 改变函数的this指向: 这是call、apply、bind最基本的功能。我们可以利用它们来改变函数运行时的this指向,从而达到特定的目的。例如,我们可以用call方法来将一个函数的this指向设置为一个对象,从而让该函数可以访问该对象的数据和方法。
  • 函数柯里化: 函数柯里化是指将一个函数拆分成一系列更小的函数,每个小函数都只完成整个函数的一部分功能。我们可以利用bind方法来实现函数柯里化。
  • 事件监听器: 在addEventListener()方法中,我们可以使用call或apply方法来指定事件监听器的this值。这可以让我们更方便地处理事件。
  • 模拟继承: 在 JavaScript 中,我们可以利用call或apply方法来实现模拟继承。通过将父类的构造函数作为子类的构造函数的第一个参数,我们可以让子类继承父类的属性和方法。

深入理解call、apply、bind的底层原理

    为了更好地理解call、apply、bind的运作原理,我们需要深入到JavaScript的底层机制。
  • this是什么: this是一个指向当前执行上下文的指针。在全局作用域中,this指向window对象。在函数内部,this指向该函数所属的对象。如果函数没有被任何对象调用,那么this指向undefined。
  • 改变this指向的本质: call、apply、bind这三个函数本质上都是利用了JavaScript的原型链机制来实现改变this指向的目的。当我们使用call、apply或bind方法时,我们会传入一个新的this值,然后JavaScript引擎会沿着原型链向上查找该this值对应的对象。找到该对象后,JavaScript引擎会将该对象的属性和方法赋予给函数的this对象。

总结

    call、apply、bind这三个函数是JavaScript中非常重要的工具。它们可以改变函数运行时的this指向,从而实现各种各样的功能。掌握了这些函数的使用方法,可以帮助我们更好地理解JavaScript的底层机制,并编写出更灵活、更强大的代码。