JavaScript中call() 、 apply() 、bind()三者的作用和区别

在刚接触javascript时,就碰到call(),apply(),bind(),我一直不是很明白。在工作中接触它们次数多了,对这三个方法也有了点理解,总的就是一句话:三者的作用都是改变函数的执行上下文。今天把它们简单阐述一下!

JavaScript权威指南上的解释是: call() 、apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数。我理解它们的作用是:都能继承另一个对象的方法和属性。bind() 就是将某个函数(属性或方法)绑定到某个对象上。

var obj = {name: "Tom"}

function foo() {console.log(this.name)}

foo.call(obj)       //打印结果: Tom   this 指向 指定的对象(obj)
  • call() 和apply()的第一个参数都是指定的对象。这个对象就是该函数的执行上下文。
  • call()和apply()的区别:两者之间的参数不同
    call()在第一个参数之后的 后续所有参数就是传入该函数的值(形参)。
    apply() 只有两个参数,第一个是指定的对象,第二个是数组,这个数组的每一个元素都是该函数的参数(形参)。
// call()函数
var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName);
}

getName.call(obj, 'Tom', 'Jorry') // My name is: Tom  this 指向 指定的对象(obj)
// apply() 函数
var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName);
}

getName.apply(obj, ['Tom', 'Jorry']) // My name is: Tom  传参 是一个数组

//  this 指向 指定的对象(obj)

bind() 它的参数和call()相同。它和前两者不同在于: bind() 方法会返回执行上下文被改变的函数而不会立即执行,而前两者是直接执行该函数。

你可能感兴趣的:(JavaScript中call() 、 apply() 、bind()三者的作用和区别)