在刚接触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() 方法会返回执行上下文被改变的函数而不会立即执行,而前两者是直接执行该函数。
网友评论