可以改變this指向的方法


this一般指向的是當前被調用者,但也可以通過其它方式來改變它的指向,下面將介紹三種方式:

1.call用作繼承時:

function Parent(age){
    this.name=['mike','jack','smith'];
    this.age=age;
}
function Child(age){
    Parent.call(this,age);//把this指向Parent,同時還可以傳遞參數
}
var test=new Child(21);
console.log(test.age);//21
console.log(test.name);

test.name.push('bill');
console.log(test.name);//mike,jack,smith,bill

2.call和apply都可以改變this指向,不過call的第二個參數是散列分布,apply則可以是一個數組

console.log(Math.max.apply(null,[1,2,3,4]));//4

apply() 方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,第二個參數可以是 Array 的實例,也可以是arguments 對象。call() 方法與 apply() 方法的作用相同,它們的區別僅在於接收參數的方式不同。對於 call()方法而言,第一個參數是 this 值沒有變化,變化的是其余參數都直接傳遞給函數。換句話說,在使用call() 方法時,傳遞給函數的參數必須逐個列舉出來。如 func.call(func1,var1,var2,var3)  對應的apply寫法為:func.apply(func1,[var1,var2,var3]),同時使用apply的好處是可以直接將當前函數的arguments對象作為apply的第二個參數傳入。 
3.ES5還定義了一個方法:bind(),它會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值。如

window.color='red';
var o={color:'blue'};

function sayColor(){
    console.log(this.color);
}
var objectSaycolor=sayColor.bind(o);
//var objectSaycolor=sayColor.bind();
objectSaycolor();//blue

在這里sayColor()調用bind()並傳入對象o,創建了objectSayColor()函數。objectSayColor()函數的this值等於o,因此即使是在全局作用域中調用這個函數,也會看到blue。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM