js中改變this指向的三個常用方法bind,call和apply
阿新 • • 發佈:2019-01-07
一.bind:
說起bind,很多人都會想起jquery中的bind繫結方法,給元素繫結事件,今天所講的bind則是js的原生方法---可改變this的指向,下面我們來看演示:
var name = 'sally'; function sayName(){ return this.name; } function sayName2(){ return this.name } var o = { 'name':'John', sayName:sayName, sayName2:sayName2.bind(window) }; console.log(o.sayName()); //John console.log(o.sayName2());//sally
結果看來很明顯,兩個方法都是o物件來呼叫的,在不使用bind改變this指向空間時,兩個均為John,但由於bind的特殊作用,將其指向繫結為window的,因為最後一個輸出了全域性變數的name;
二.call和apply:
相同點:call和apply均可以改變this指向,
不同點:call接受的引數為一個一個的,但是apply接受的引數只能為一個嚴格的陣列(詳情見如下的程式碼演示)
var name = 'sally'; function sayName(){ return this.name; } var o = { 'name':'John', sayName:sayName }; sayName();
結果為:sally 因為此時this所指物件為window
sayName.call(o);
//sayName.apply(o);
以上不管哪一個,均可以將其this指向指向為o,那又有什麼不同點呢?var name = 'sally';
function sayName(){
console.log (this.name,arguments)
}
sayName.call(o,1,2,3);
但若換成apply的話,會報錯,因為apply接受的引數應該是一個嚴格意義的陣列。
若改成下面的就可以了,
sayName.apply(o,[1,2,3])
新開的部落格,歡迎各位搶佔沙發,積極評論,哈哈