1、apply造垛、call 魔招、bind的作用與區(qū)別?
call、apply 調(diào)用一個函數(shù)五辽,傳入函數(shù)執(zhí)行上下文及參數(shù)
call仆百、apply 通過設(shè)置函數(shù)內(nèi)部的this和函數(shù)的參數(shù)來調(diào)用函數(shù)并返回函數(shù)的返回結(jié)果
fn.call(context, param1, param2...)
fn.apply(context, paramArray)
第一個參數(shù)都是希望設(shè)置的this對象,不同之處在于call方法接收參數(shù)列表奔脐,而apply接收參數(shù)數(shù)組
fn.bind(thisArg[, arg1[, arg2[, ...]]])
- thisArg 當(dāng)綁定函數(shù)被調(diào)用時俄周,該參數(shù)會作為原函數(shù)運行時的 this 指向吁讨。當(dāng)使用new操作符調(diào)用綁定函數(shù)時,該參數(shù)無效峦朗。
- arg1, arg2, ... 當(dāng)綁定函數(shù)被調(diào)用時建丧,這些參數(shù)將置于實參之前傳遞給被綁定的方法。
返回一個新函數(shù)波势,新函數(shù)與被調(diào)函數(shù)(綁定函數(shù)的目標(biāo)函數(shù))具有相同的函數(shù)體翎朱,并且指定函數(shù)內(nèi)部的 this 為傳入的第一個參數(shù)。綁定函數(shù)被調(diào)用時尺铣,bind() 也接受預(yù)設(shè)的參數(shù)提供給原函數(shù)拴曲。
bind() 最簡單的用法是創(chuàng)建一個函數(shù),使這個函數(shù)不論怎么調(diào)用都有同樣的 this 值凛忿。
bind 把函數(shù)的this及部分參數(shù)固定為某個值澈灼,返回一個新的函數(shù),調(diào)用新的函數(shù)的時候可以繼續(xù)傳入?yún)?shù)店溢,最終已固定的參數(shù)和繼續(xù)傳入的參數(shù)會一起傳給原函數(shù)叁熔,并把原函數(shù)的返回值返回。
curry (自動bind)每次都固定剩下的參數(shù)床牧,直到傳入的參數(shù)達到預(yù)定數(shù)量以后才真正調(diào)用原函數(shù)并返回荣回。一般來說curry不會傳入this
2、練習(xí)
1: 下面代碼輸出什么戈咳,為什么
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!") //彈出 John: hi!
}
john.sayHi = func
john.sayHi() //等價于john.sayHi.call(john)心软,this指向的是john
2: 下面代碼輸出什么,為什么
func() //等價于 func.call(undefined)著蛙,可以簡寫為 func.call()
function func() {
alert(this) //彈出window
}
按理說打印出來的 this 應(yīng)該就是 undefined 了吧糯累,但是瀏覽器里有一條規(guī)則:
- 如果你傳的 context 是 null 或者 undefined,那么 window 對象就是默認的 context(嚴(yán)格模式下默認 context 是 undefined)
3:下面代碼輸出什么
document.addEventListener('click', function(e){
console.log(this); //document册踩,綁定事件中的this指向事件源
setTimeout(function(){
console.log(this); //window泳姐,setTimeout、setInterval這兩個方法執(zhí)行的函數(shù)this也是全局對象
}, 200);
}, false);
4:下面代碼輸出什么暂吉,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName ) //彈出John
}
func.call(john) // call()傳入的第一個參數(shù)是希望設(shè)置的this對象胖秒,指定了this為john
5: 以下代碼有什么問題,如何修改
var module= {
bind: function(){
var _this = this //保存一個this
$btn.on('click', function(){
console.log(this) //this指什么:事件綁定的回調(diào)函數(shù)中的this是指綁定的元素慕的,這里this指$btn
_this.showMsg(); //但是$btn上是沒有showMsg方法的阎肝,需要使用剛才保存的this
})
},
showMsg: function(){
console.log('lalala');
}
}