Javascript 中的 call、apply、bind

106 阅读3分钟

call()apply(),  bind() 都是 JavaScript 中常用的函数方法。它们可以指定函数中的 this 指向哪个对象,以及传递参数给函数。三者的用法不同。

  • call()的作用是将函数的 this 值设置为一个特定的对象,并且在特定的对象上调用函数,同时可以传递多个参数。
  • apply()方法调用一个函数,并设置函数内部的this值为一个特定的对象,同时传入一个包含多个参数的数组作为函数的参数。
  • bind()可以用于创建一个新的函数,并将它的this值设置为一个特定的对象。bind()的作用是将函数绑定在特定的对象上,并返回一个函数引用,此时 this关键字 指向绑定的对象

call

  • 在Javascript中,call()是一个函数方法,用于在函数执行时指定函数中的 this 关键字。
  • call()的作用是将函数的 this 值设置为一个特定的对象,并且在特定的对象上调用函数,同时可以传递多个参数。

基本语法:

function.call(thisArg, arg1, arg2, arg3, ...)

其中:

  • function:要调用的函数。
  • thisArg:用于设置函数中this的值的对象。
  • arg1, arg2, arg3, ...:调用函数时传递的参数列表。

注意,thisArg是第一个参数,它是必需的,其他的参数是可选的。如果没有传递任何参数,可以将nullundefined传递给thisArg

示例代码:

function sayHi(greeting, message) {
  console.log(greeting + ', ' + message + ', ' + this.firstName + ' ' + this.lastName);
}

var person = {
  firstName: 'hello',
  lastName: 'world'
};

sayHi.call(person, '你好', '欢迎来到我的世界'); // 输出 "你好, 欢迎来到我的世界, hello world"

在上面的例子中,我们使用call()方法在调用 sayHi函数 时将其 this值 设置为person对象,从而访问到person对象中的firstNamelastName属性。如此一来,函数的输出结果将为"你好, 欢迎来到我的世界, hello world"

如果我们再加一个parsen2,用sayHi.call(person2),那么this值 就是person2对象。

function sayHi(greeting, message) {
  console.log(greeting + ', ' + message + ', ' + this.firstName + ' ' + this.lastName);
}

var person = {
  firstName: 'hello',
  lastName: 'world'
};

var person2 = {
  firstName: '你好',
  lastName: '世界'
};

sayHi.call(person2, '你好', '欢迎来到我的世界'); // 输出 "你好, 欢迎来到我的世界, 你好 世界"

apply

在Javascript中,apply()是一个函数方法,同call()函数方法一样,可以用于设置函数中this的值,但apply()传递参数的方式略有不同。

apply()方法调用一个函数,并设置函数内部的this值为一个特定的对象,同时 传入一个包含多个参数的数组作为函数的参数

示例代码:

function sayHi(greeting) {
  console.log(greeting + ', ' + this.name + '!');
}

var person = {
  name: 'hao'
};

// 使用 apply() 调用函数 sayHi(),将其中的 this 关键字设置为 person 对象,并传递一个包含字符串参数的数组
sayHi.apply(person, ['nice to meet you']);

在上面的例子中,我们使用apply()方法将sayHi()函数的 this关键字 设置为person对象,并通过传递包含'nice to meet you'字符串参数的数组来调用该函数。

调用以上代码时,控制台将输出nice to meet you, hao!

bind

在Javascript中,bind()是一个函数方法,可以用于创建一个新的函数,并将它的this值设置为一个特定的对象。bind()方法与call()apply()不同,它不会立即调用函数,而是返回一个新函数,可以稍后调用。

bind()的作用是将函数绑定在特定的对象上,并返回一个函数引用,此时 this关键字 指向绑定的对象

示例代码:

var person = {
  name: 'hello'
};

function sayHi(greeting) {
  console.log(greeting + ', ' + this.name + '!');
}

// 使用 bind() 方法创建一个新函数,将其中的 this 关键字绑定到 person 对象上
var personSayHi = sayHi.bind(person);

// 调用新函数 personSayHi,传入一个字符串参数
personSayHi('nice to meet you');

在上面的例子中,我们使用bind()方法将sayHi()函数的this关键字设置为person对象,并将返回的新函数引用赋值给personSayHi。然后我们通过调用personSayHi()来执行该函数。

调用以上代码时,控制台将输出“nice to meet you, hello!”。