紅寶書上定義:每個函數(shù)都包含兩個非繼承而來(即在構造函數(shù)Function的 prototype)的方法箩朴。apply()和call()秋度,在特定的作用域上調(diào)用函數(shù),實際上等于設置函數(shù)體內(nèi)this對象的值荚斯。
apply()方法接受兩個參數(shù),第一個參數(shù)是運行該函數(shù)的作用域(即調(diào)用該函數(shù)的對象)滥壕,第二個參數(shù)是函數(shù)參數(shù)數(shù)組兽泣。
call()第一個參數(shù)和apply()一樣,從第二個參數(shù)開始称鳞,是傳遞給函數(shù)的所有參數(shù)
var name = 'aaa'//全局變量name
function sayHi(a, b) {
console.log(this.name + ',你好!說' + a + ',' + b)
}
var o = {
name: 'bbb'
}
sayHi.call(this, 1, 2)//全局作用域下調(diào)用稠鼻,this默認指向Window
sayHi.call(o, 1, 2)//將this指向o
sayHi.apply(this, [1, 2])
sayHi.apply(o, [1, 2])
bind()會創(chuàng)建一個函數(shù)實例候齿,this的值會被綁定到傳給bind()的值。bind的第一個參數(shù)和call apply 一樣指定執(zhí)行上下文慌盯,從第二個參數(shù)開始和call 一樣,順序傳入函數(shù)的參數(shù)。
var newSayHi = sayHi.bind({ name: 'ccc' }, 1, 2)
newSayHi()
sayHi.bind({ name: 'ccc' }, 1, 2)
將新的ccc對象傳給了this唉匾,即使在全局作用域下調(diào)用newSayHi
也能將this指向ccc
總結
- 三者都是可以用來改變函數(shù)的this對象的指向孕讳,都可以利用后續(xù)參數(shù)傳參;
- bind 是返回this改變指向的函數(shù)巍膘,便于稍后調(diào)用厂财;apply 、call 則是立即調(diào)用 峡懈。