【问题标题】:Scoping issue with prototypes and async.forEach原型和 async.forEach 的范围问题
【发布时间】:2012-10-24 20:23:09
【问题描述】:

我有一个不明白的范围问题。

我有这个对象有一些方法:

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 # has no method 'uploadImage'

我在 handleImage 内部尝试了以下内容:

this.uploadImage

还有:

that = this
that.uploadImage

都不行。

如果我在 forEach 循环之外调用 fileInfo.handleImage,它可以很好地处理这个或那个。

【问题讨论】:

    标签: javascript node.js asynchronous coffeescript


    【解决方案1】:

    fileInfo.handleImage 更改为fileInfo.handleImage.bind(fileInfo)(假设fileInfoFileInfo实例)。

    它正在丢失您期望的 this 绑定(即,当该函数执行时,this,不要与 execution context 混淆,请参阅 cmets) ,因为您不会立即调用它,只需传递对它的引用。

    【讨论】:

    • 拜托,函数的 this 关键字不是“上下文”。函数的this 绑定设置为建立execution context 的组件,完全由bind 的调用或使用设置。
    • @RobG 你不认为将它称为 context 对 JavaScript 经验较少的人来说更容易(我假设是 OP)?
    • 不,因为他们认为它与调用函数的 where 相关(即实际上下文),而不是 如何叫。此外,ECMA-262 仅使用与“执行上下文”相关的“上下文”一词,而不是 this
    • 我认为将其称为上下文是合理的,就像在执行它的上下文中一样(未调用)。我指的不是调用上下文,只是执行函数的上下文。我会尝试找到一个与 ECMA 中定义的术语不冲突的更好的术语。
    • 我认为这就是我的观点。函数的this 是其执行上下文的一个组件,它没有定义它。可引用this或“this关键字”进行搜索。
    【解决方案2】:

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

    但是,要使粗箭头起作用,您需要使用惯用的 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 中的绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多