標籤:
this指標總是指向一個對象,大致可以分為以下四種:
1,作為對象的方法調用(this指向該對象)
2,作為普通函數調用
當函數不作為對象的屬性被調用時,也就是普通函數方式,此時的this總是指向全域對象。在瀏覽器的javascript中,全域對象就是windows。
1 window.name=‘globaiName‘;2 var getName=function(){3 return this.name;4 };5 console.log(getName());this指向全域對象
3,構造器調用
javascript中沒有類,但是可以從構造器中建立對象,同時也提供了new運算子,使得構造器看起來更像一個類。
當用new運算子調用函數時,該函數總會返回一個對象,通常,構造器裡的this就指向返回的這個對象
var MyClass(){ this.name=‘sven‘;};var obj=new MyClass();alert(obj.name);構造器裡的this
但是如果構造器顯示的返回了一個object類型的對象,那麼結果最終會返回這個對象。
var MyClass(){ this.name=‘sven‘; return { //顯示返回一個對象 name:‘anne‘;}};var obj=new MyClass();alert(obj.name); //輸出anne 構造器顯示返回object類型對象
4,Function.prototype.call 和 Function.prototype.apply
他們的作用一樣,區別在於傳入參數的形式不同。apply接受兩個參數,第一個參數指定了函數體內this對象的指向,第二個參數作為一個帶下標的集合,可以是數組,也可以是類數組。
call傳入的參數數量不固定,第一個參數指定了函數體內this對象的指向,從第二個參數開始,每個參數被依次傳入函數。
如果我們傳入的第一個參數是null時,函數體內的this會指向預設的宿主對象,在瀏覽器中就是window。
1 document.getElementById = (function (func){2 return function(){3 return func.apply(document,arguments);4 }5 })(document.getElementById);6 var getId = document.getElementById;7 var div = getId(‘div1‘);8 alert(div.id); //輸出div1用apply來修正this指向
this call和apply