Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型和async.forEach的作用域问题_Javascript_Node.js_Asynchronous_Coffeescript - Fatal编程技术网

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
或“此关键字”用于搜索。