我有一个我不明白的范围问题。
我有一些方法有这个对象:
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,它可以正常工作。
答案 0 :(得分:1)
将fileInfo.handleImage
更改为fileInfo.handleImage.bind(fileInfo)
(假设fileInfo
是FileInfo
的实例。
当该函数正在执行时,它正在丢失this
绑定(即this
的值,不要与execution context混淆,你期望的,因为你没有立即调用它,只需传递一个引用。
答案 1 :(得分:0)
您可以使用上面建议的bind或胖箭头(=>)
然而,为了使胖箭工作,你需要使用惯用的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中的绑定。