JS與java在this關鍵字上的處理是不同的,Java可以很清晰的明白this指代的是哪個對象,而js則會產生很多歧義,接下來,我們一步一步解釋JS中不同函數或閉包里面的this關鍵字。
普遍的函數調用: 最后一行代碼是完整的調用寫法,可以輕易看出調用者為window,所以方法里面的this指代window
function testThis1(){ console.info("Test1="+this);}testThis1();// 簡單的寫法window.testThis1();//完整的寫法嵌套函數調用: 外部函數將返回嵌套函數fn,此時并沒有直接調用fn,而是在最外層才調用,所以結果也同上,是由window調用fn,fn里面的this為window
function testThis2(){ var fn = function(){ console.info("Test2="+this); } return fn;}var temp = testThis2();// 將一個函數賦值給變量temptemp();// 正式調用函數window.temp();// 完整寫法對象的函數調用: 將函數賦值給對象的屬性,作為對象的方法調用,此時調用應該是obj1.action(),明顯的看出調用者變為了obj1,又由于所有全局變量都是window的屬性,所以可以像最后一行那樣調用函數,打印的this結果都是obj1
var obj1 = { action:function(){ console.info("Test3="+this); }};obj1.action();// 對象函數調用window.obj1.action();// 完整寫法調用對象函數返回的函數: 當對象函數里面返回函數時,實際上并沒有立即調用這個函數,而是返回到最外層進行調用,所以這個嵌套函數的調用者仍然是window,但是對象函數調用者為obj2。也就是說action()里面this指代obj2,匿名嵌套函數this指代window
var obj2 = { action:function(){ console.info(this);// 打印obj2 var that = this;// 通??梢跃彺鎡his也就是obj2,然后內層函數就可以直接用that,而不是使用this了 return function(){ console.info(that);// 打印obj2 console.info(this);// 打印window }; }}obj2.action();// 返回一個函數,但此時沒有調用該函數obj2.action()();// 正式調用函數,該代碼最后的效果應該類似于下面的代碼(function(){console.info(this);})();新聞熱點
疑難解答