原型和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,它可以正常使用这个或那个。

fileInfo.handleImage.bind(fileInfo)更改为fileInfo.handleImage.bind(fileInfo) (假定fileInfoFileInfo一个实例 )。

它正在失去你期望的this绑定(也就是this函数执行时的 ,而不是与执行上下文混淆,见注释),因为你不会立即调用它,它。

您可以使用上面build议的绑定或胖箭头(=>)

然而,脂肪箭头的工作,你需要使用惯用的Coffeescript类。 通过分配原型槽build立一个正常的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中生成绑定。