Javascript 原型和async.forEach的作用域问题
我有一个我不明白的范围问题 我用一些方法处理这个对象:Javascript 原型和async.forEach的作用域问题,javascript,node.js,asynchronous,coffeescript,Javascript,Node.js,Asynchronous,Coffeescript,我有一个我不明白的范围问题 我用一些方法处理这个对象: FileInfo = (file) -> @name = path.basename(file.path); FileInfo::uploadImage = (filename, callback) -> FileInfo::handleImage = (version, callback) -> # Here I would like to call uploadImage 我正在从async.forE
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
更改为fileInfo.handleImage.bind(fileInfo)
(假设fileInfo
是fileInfo
的一个实例)
它正在丢失您所期望的
this
绑定(即,当该函数正在执行时,this
的值,不要与注释混淆,请参见注释),因为您不立即调用它,只传递对它的引用 将fileInfo.handleImage
更改为fileInfo.handleImage.bind(fileInfo)
(假设fileInfo
是fileInfo
的一个实例)
它正在丢失您所期望的
this
绑定(即,当该函数正在执行时,this
的值,不要与注释混淆,请参见注释),因为您不立即调用它,只传递对它的引用 您可以使用上面建议的绑定,也可以使用胖箭头(=>)
然而,要想让胖箭发挥作用,你需要使用惯用的咖啡脚本
上课。通过指定prototype以常规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中的绑定。您可以按照上面的建议使用绑定,也可以使用胖箭头(=>) 然而,要想让胖箭发挥作用,你需要使用惯用的咖啡脚本 上课。通过指定prototype以常规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绑定。请注意,函数的
此
关键字不是“上下文”。函数的此
绑定被设置为建立函数的一个组件,并完全通过调用或使用来设置。@RobG您不认为将其作为上下文引用对于JavaScript经验较少的人(我假设是OP)更容易吗?不,因为他们认为它与函数的调用位置相关(即实际上下文)而不是如何调用。此外,ECMA-262仅在“执行上下文”中使用“上下文”一词,而不是此。我认为将其称为上下文是合理的,就像在执行它的上下文中一样(未调用)。我不是指调用上下文,只是指执行函数的上下文。我会尝试找到一个与ECMA中定义的术语不冲突的更好的术语。我认为这是我的观点。函数的this
是其执行上下文的一个组成部分,它不定义它。它可以被引用为this
或“this关键字”用于搜索。请注意,函数的this
关键字不是“上下文”。函数的this
绑定被设置为建立的一个组件,完全通过调用或使用来设置。@RobG您不认为对于JavaScript经验较少的人来说,将其称为上下文更容易(我假设是OP)?不,因为他们认为它与调用函数的位置(即实际上下文)有关,而不是与调用函数的方式有关。此外,ECMA-262仅在“执行上下文”中使用“上下文”一词,而不是此
。我认为将其称为上下文是合理的,就像在执行它的上下文中一样(未调用)。我不是指调用上下文,只是指执行函数的上下文。我会尝试找到一个更好的术语,它不会与ECMA中定义的术语冲突。我认为这是我的观点。函数的this
是其执行上下文的一个组成部分,而不是定义它。它可以被引用为this
或“此关键字”用于搜索。