JavaScript之call、apply和bind

作者: JaniceZD | 来源:发表于2019-06-24 14:22 被阅读1次

虽然在 JavaScript之 this 关键字 中已经谈到了callapplybind的用法,但篇幅较长,不利于记忆,故本篇再次进行总结。

callapplybind 的用法分别是什么?

JavaScript 提供了callapplybind 这三个方法,来切换/固定 this 的指向。

1. call方法

函数实例的 call 方法,可以指定函数内部 this 的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。

var obj = {};

var f = function () {
  return this;
};

f() === window // true
f.call(obj) === obj // true

上面代码中,全局环境运行函数f时,this 指向全局环境(浏览器为window 对象);call 方法可以改变 this 的指向,指定 this 指向对象 obj,然后在对象obj 的作用域中运行函数 f

call 方法的参数,应该是一个对象。如果参数为空、nullundefined,则默认传入全局对象。

使用格式如下:

func.call(thisValue, arg1, arg2, ...)

call 的第一个参数就是 this 所要指向的那个对象,后面的参数则是函数调用时所需的参数。

2. apply方法

apply 方法的作用与 call 方法类似,也是改变 this 指向,然后再调用该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数,使用格式如下。

func.apply(thisValue, [arg1, arg2, ...])

apply 方法的第一个参数也是 this 所要指向的那个对象,如果设为 nullundefined,则等同于指定全局对象。第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数。原函数的参数,在 call 方法中必须一个个添加,但是在 apply 方法中,必须以数组形式添加。

以下为apply方法常用用法:

  • 找出数组最大元素
    结合使用 apply 方法和 Math.max 方法,就可以返回数组的最大元素。
var a = [10, 2, 4, 15, 9];
Math.max.apply(null, a) // 15
  • 转换类似数组的对象
    利用数组对象的 slice 方法,可以将一个类似数组的对象(比如 arguments 对象)转为真正的数组。
Array.prototype.slice.apply({0: 1, length: 1}) // [1]
Array.prototype.slice.apply({0: 1}) // []
  • 将数组的空元素变为 undefined
    通过 apply 方法,利用 Array 构造函数将数组的空元素变成undefined
Array.apply(null, ['a', ,'b'])
// [ 'a', undefined, 'b' ]

3. bind方法

bind 方法用于将函数体内的 this 绑定到某个对象,然后返回一个新函数。

bind 方法的参数就是所要绑定 this 的对象。如果 bind 方法的第一个参数是 nullundefined,等于将 this 绑定到全局对象,函数运行时 this 指向顶层对象(浏览器为 window)。

var counter = {
  count: 0,
  inc: function () {
    this.count++;
  }
};

var func = counter.inc.bind(counter);
func();
counter.count // 1

上面代码中,counter.inc 方法被赋值给变量func。这时必须用bind方法将 inc 内部的 this,绑定到 counter,否则就会出错。

总结

  • applycallbind 三者都是用来改变函数的 this 对象的指向的;
  • applycallbind 三者第一个参数都是 this 要指向的对象;
  • applycallbind 三者都可以利用后续参数传参;
  • bind 是返回对应函数,便于稍后调用;applycall 则是立即调用 。

参考链接

相关文章

网友评论

    本文标题:JavaScript之call、apply和bind

    本文链接:https://www.haomeiwen.com/subject/rjanqctx.html