首先看一段代碼:
這樣就出現問題了,隻有obj.printid()傳回了我們想要的結果,第二種調用隻是個指派,但this卻指向global,第三種調用,this指向object,但是顯然不是我們定義的obj,是以它擷取不到id屬性。原因就在于,在javascript中,this關鍵字的指向是在函數調用的時候定義的。callback()在調用的時候,屬于全局頂層的函數,已經不是我們定義的obj中的一個函數,是以this指向global,至于settimeout的回調函數調用方式之是以指向一個object,這應該和settimeout這個api的實作方式有關
那我們有沒有辦法用callback和settimeout方式顯示出正常結果呢?你可以這樣寫:
第一個,最簡單的例子:
第二個,加個異步函數,也很簡單:
第三個,我們制作一個方法數組:
第一個,如我們所想,輸出0,1,2,3,4;可是第二個第三個都是5,5,5,5,5.
原因分析:我們在for循環中定義的變量i,在for循環結束後還沒有走出它的作用域,也就是說for循環之後,i依然可以通路,值等于最後一次循環後的值,就是5了。第二段代碼中,settimeout的回調函數執行時,for循環已經完成,此時i就是5。同理,第三段代碼,在data[i]()執行時,i已經是5了。當然,我們有辦法讓它顯示正确結果,但要增加一個變量,像這樣: