this
一個函數內部是「接收器」它是在調用。
即,
供構建x.f()
,this
函數(f
)內將評估爲的x
值。
對於所有其他情況,this
將評估爲window
在被調用的函數內部。(功能call
,apply
,並bind
也改變this
......但那是另一回事。)
在投稿例如第二功能(具有this.name
)是不使用調用x.f()
表格等等this
是window
對象。
「簡單修復」是使用一個封閉件:(第一功能被在x.f()
形式調用,並且因此this
相同object
,其如預期我們在目前捕捉的this
值。通過與self
創建的關閉和返回的功能範圍。)
getNameFunc : function() {
var self = this
return function() {
return self.name
}
}
不過,我可能會考慮其他的設計,這取決於:)
編碼愉快。
進一步澄清,發表評論:
...那是因爲你使用的是circle.getArea()
它的形式是x.f()
的。因此getArea函數內的this
評估爲circle
。
在發佈的代碼中,您連續調用兩個不同的函數。想象一下,寫這樣的代碼:
var nameFunc = object.getNameFunc()
nameFunc()
第一個函數調用中的x.f()
的形式,因此this
內getNameFunc是object
評價。但是,在第二行中,函數(nameFunc)是而不是以x.f()
的形式調用。因此,nameFunc中的this
(從getNameFunc返回的函數)將評估爲window
,如上所述。
爲什麼你裏面'getNameFunc'另一個內部匿名函數?你可以做'return this.name'; – vsync
我刪除getNameFunc中的另一個內部匿名函數,但代碼無法工作。 var name =「The Window」; var object = { name:「My Object」, getNameFunc:function(){ return this.name; }; }; alert(object.getNameFunc()); – zhuanzhou
檢查下面的答案,我已經爲它創建了一個代碼片段 – vsync