1. 程式人生 > >js中改變this指向的三個常用方法bind,call和apply

js中改變this指向的三個常用方法bind,call和apply

一.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])

新開的部落格,歡迎各位搶佔沙發,積極評論,哈哈