红宝书上定义:每个函数都包含两个非继承而来(即在构造函数Function的 prototype)的方法。apply()和call(),在特定的作用域上调用函数,实际上等于设置函数体内this对象的值。
apply()方法接受两个参数,第一个参数是运行该函数的作用域(即调用该函数的对象),第二个参数是函数参数数组。
call()第一个参数和apply()一样,从第二个参数开始,是传递给函数的所有参数
var name = 'aaa'//全局变量name
function sayHi(a, b) {
console.log(this.name + ',你好!说' + a + ',' + b)
}
var o = {
name: 'bbb'
}
sayHi.call(this, 1, 2)//全局作用域下调用,this默认指向Window
sayHi.call(o, 1, 2)//将this指向o
sayHi.apply(this, [1, 2])
sayHi.apply(o, [1, 2])
call和apply.png
bind()会创建一个函数实例,this的值会被绑定到传给bind()的值。bind的第一个参数和call apply 一样指定执行上下文,从第二个参数开始和call 一样,顺序传入函数的参数。
var newSayHi = sayHi.bind({ name: 'ccc' }, 1, 2)
newSayHi()
bind.png
sayHi.bind({ name: 'ccc' }, 1, 2)
将新的ccc对象传给了this,即使在全局作用域下调用newSayHi
也能将this指向ccc
总结
- 三者都是可以用来改变函数的this对象的指向,都可以利用后续参数传参;
- bind 是返回this改变指向的函数,便于稍后调用;apply 、call 则是立即调用 。
网友评论