每日一則(2):call apply bind
阿新 • • 發佈:2019-02-06
他們最重要的作用就是改變this指向,但是三個方法有相同之處也有不用之處,俺就來小小的總結下嘍。
call和apply
1.call
作用:
- 1.呼叫函式(如果不傳引數的話,就跟普通呼叫是一致的)
function foo(){
console.log("holle!")
}
foo.call(null(用來告訴不需要改變this指向),1,2);
2.改變所呼叫函式中this指標的指向後,再次呼叫該函式,他的指向就又是window了,意思就是他們只能改變當前繫結的函式中的this 不是永久性的改變,再次呼叫原函式 ,this指向就恢復了。
function foo
這個時候的this就是obj
- 3.借用別的物件的方法
2.apply
作用:
- 1.呼叫函式(如果不傳引數的話,就跟普通呼叫是一致的)
function foo(){
console.log("holle!")
}
foo.apply(null(用來告訴不需要改變this指向),【1,2】);
2.改變所呼叫函式中this指標的指向後,再次呼叫該函式,他的指向就又是window了,意思就是他們只能改變當前繫結的函式中的this 不是永久性的改變,再次呼叫原函式 ,this指向就恢復了。
function foo(){ this.nam } var obj ={ info:“tom”; } foo.apply(obj);
這個時候的this就是obj
- 3.借用別的物件的方法
例如求陣列中的最大值
var arr=[1,2,3,21,55,55].
var man=Math.max.apply(null,arr);
陣列中沒有max這個方法,通過apply來借用下max方法給陣列用。
3.兩者的區別
他們的作用是完全相同的,唯一區別在於傳遞引數的時候。
call的引數是單個的
apply的引數是一個數組
4.什麼時候用null,什麼時候不用
- 當你要借用別的物件的方法的時候,就要必須寫null
- 如果是直接傳遞普通引數,就必須寫null
- 如果傳遞物件就是改變他的this指向 就不用寫null
bind(ES5提供的api)
作用
- 1.改變this指向
- 2.他也可以傳遞引數的(從引數的層面,跟call像)
注意
- 執行的時候並不呼叫函式
- 他會返回一個新的函式,這個新的函式的內部的this指標已經改變,改變成傳遞進去的那個物件,原函式的this指向是不變的。
應用場景
setinterval((function(a,b){
console.log(this.info);
console.log(a+b);
}).bind({info:“jrye”},1,1),1000)
setinterval呼叫的函式,不是bind呼叫的
為了檢測以下你是不是真的認真思考我的每一句話,給您出個小題目,做做看吧。
function Foo(){
console.log(this.info)
}
Foo.bind({info:"holle"})();
Foo();
var fn= Foo.bind({info:"holle"});
fn();
分別會輸出什麼?
holle
undefined
holle
做錯的小朋友再仔細看看內容哦,大神就莫要見笑了。有錯誤的地方歡迎指出哦,俺需要你們。