2012-11-05 46 views
1

我有一個範圍問題,我不明白。原型和async.forEach的範圍問題

我有一些方法,這個對象:

FileInfo = (file) -> 
    @name = path.basename(file.path); 

FileInfo::uploadImage = (filename, callback) -> 

FileInfo::handleImage = (version, callback) -> 
    # Here I would like to call uploadImage 

我從async.forEach循環中調用handleImage爲:

async.forEach options, fileInfo.handleImage, (err) - 

我想從內handleImage調用uploadImage但我得到TypeError:Object#沒有方法'uploadImage'

我試過了,在handleImage裏面,有以下內容:

this.uploadImage 

還有:

that = this 
that.uploadImage 

既不工作。

如果我在forEach循環之外調用fileInfo.handleImage,它可以正常使用這個或那個。

回答

1

fileInfo.handleImage變化到fileInfo.handleImage.bind(fileInfo)(假定fileInfo實例的FileInfo)。

它正在失去this結合(即,this當該功能正在執行,不要與execution context混淆,見註釋),你期望的,因爲你不馬上調用它,只是傳遞一個參考。

+0

請函數的this關鍵字不是「context」。函數的'this'綁定被設置爲建立[*執行上下文*](http://ecma-international.org/ecma-262/5.1/#sec-10.3)的一個組件,並且完全由該調用設置或使用['bind'](http://ecma-international.org/ecma-262/5.1/#sec-15.3.4.5)。 – RobG

+0

@RobG您不認爲將它引用爲* context *對於JavaScript經驗較少的人(我認爲是OP)更容易? – alex

+0

不是,因爲他們認爲它與*函數被調用(即實際上下文)相關,而不是*如何被調用。此外,ECMA-262僅使用與「執行上下文」相關的詞語「上下文」,而不是「this」。 – RobG

0

您可以使用綁定的建議或以上的脂肪箭頭(=>)

不過,對於脂肪箭頭工作,你需要使用慣用的CoffeeScript 類。通過分配原型 插槽不會工作,建立一個類正常的Javascript方式。

class FileInfo 
    constructor: (file) -> 
     @name = path.basename(file.path); 

    uploadImage: (filename, callback) -> 

            ---- fat arrow here 
            V 
    handleImage: (version, callback) => 
    # Here I would like to call uploadImage 

使用它將強制CoffeeScript編譯器爲您在Javascript中生成綁定。