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。