2016-04-22 45 views
0
var Test = (function() { 
    return { 
     someValue: 69, 
     staticMethod: function(){ 
      return this.someValue; 
     } 
    } 
}()); 

console.log(Test.staticMethod()); 

var doIt = Test.staticMethod 
console.log(doIt()) 

輸出:這是調用變量設置爲靜態方法時未定義

69 
undefined 

預計:

69 
69 

爲什麼this不會在第二個電話的情況下存在?

演示:http://jsbin.com/kidefoniko/edit?js,console

+0

因爲在沒有對象作爲上下文的情況下調用函數。任何函數的this值都取決於執行上下文。 – adeneo

+0

所以正確的方法是'doIt.call(Test)'?如果我不知道它是測試怎麼辦?無論如何找出它的上下文 – LearningJrDev

+0

不是真的,上下文是你設定的任何東西,它不是預定義的。當您執行Test.staticMethod()時,您將上下文設置爲Test,在第二個示例中,您創建對該函數的引用,然後在沒有上下文的情況下調用它,因此您必須使用'call','apply'或「綁定」來設置上下文。 – adeneo

回答

0

doIt引用相同的功能staticMethod做:

function(){ 
    return this.someValue; 
} 

this基本. 在這種通話的情況下,之前的對象:Test.staticMethod()Test

但這裏:doIt()沒有.,所以在點之前沒有任何對象。 在這種情況下,this被分配給全局對象(如果不是在嚴格模式下)。全局對象(window在瀏覽器中)沒有名爲someValue的屬性,因此undefined已註銷。

相關問題