【问题标题】:Coffee Script comprehension咖啡脚本理解
【发布时间】:2013-06-10 05:19:03
【问题描述】:

我是咖啡脚本的新手,所以我想知道我这样做是否正确。我在 JavaScript 中有一个 forEach 的原始实现,如下所示:

if(!Array.prototype.forEach){
   Array.prototype.forEach = function(callback, context){
     for(var i=0; i < this.length; i++){
        callback.call(context || null, this[i], i, this);
     }
   };
}

这是我目前在咖啡脚本中的编写方式

if not Array.prototype.forEach
    Array.prototype.forEach = (callback, context) ->
    context ?= null 
    callback context, @[i], i, @ for i in @ 

但我想知道它是否正确,尤其是上下文空检查似乎是多余的,以及上下文是否正确应用,好像我仍在使用call。我试图在咖啡脚本中查找一些关于applycall 的示例,但到目前为止还没有那么幸运。

【问题讨论】:

  • 好吧,显然it 没有使用call。它像map 一样工作,因为它返回一个results 数组。
  • coffee-script 中有一个用于原型的快捷方式。所以,最好写Array::forEach 而不是Array.prototype.forEach

标签: javascript coffeescript


【解决方案1】:

上下文空检查似乎是多余的

好吧,如果它是undefined,它还将context 设置为null。但是,should 实际上变成了undefined

上下文是否正确应用,就好像我还在使用调用一样

不,因为你没有使用它。

Better:

if not Array.prototype.forEach
    Array.prototype.forEach = (callback) ->
        context = arguments[1] if arguments.length > 1
        for el, i in @
            callback.call context, el, i, @ if i of @
        undefined

【讨论】:

  • +1,但我认为使用默认参数而不是将参数对象带入其中会更清晰/更清晰。看我的回答。
  • 是的,默认参数更像咖啡脚本。不同之处在于函数的数量(.length),根据规范应该是1。当然,这是一个小问题:-)
  • 此代码已损坏,因为i 不是此处的索引。要修复它,请使用for i of @ 循环和if @[i] in @ 检查。无论如何,for val, i in 循环似乎更适合这种情况。
  • @LeonidBeschastny:感谢您的提示,现已修复。你肯定比我更了解coffeescript(希望我能两次支持你的答案):-)
【解决方案2】:

我赞成 Bergi 的解释,但这里有一个稍微干净的版本,因为咖啡脚本参数可以有默认值。

if not Array.prototype.forEach
    Array.prototype.forEach = (callback,context = null) ->
        for i in @
            callback.call context, @[i], i, @ if i of @
        undefined

【讨论】:

【解决方案3】:

in 运算符在coffee-script 中的工作方式完全不同。因此,在coffee-script 中,您的代码将如下所示:

Array::forEach ?= (callback, context) ->
  callback.call context, elem, i, @ for elem, i in @
  return

让我们看看这段代码。

Array::forEach 只是Array.prototype.forEach 的快捷方式。

?= 表示“如果未分配则分配”。

for elem, i in smthcoffee-script in 运算符的一种特殊形式,它允许您捕获元素的索引以及它的值。通常,coffee-script 中的 for .. in .. 运算符仅对元素进行操作,而不对其索引进行操作。

return 在函数末尾告诉编译器您不想返回最后一个操作的结果,在您的情况下是for 循环。没有它coffee-script 将在for 循环中捕获每个调用的结果,然后将它们全部作为单个数组返回。显然,您不希望完成这些额外的工作。

您可以将context 变量的默认值设置为null,但这不是必需的,因为undefined 的工作方式与null 完全相同。您当前的代码处理 context = false 的方式与处理未定义上下文的方式相同。要强制这种行为,请将context ||= null 添加到函数的开头,但这似乎是多余的。

您也可以使用js2coffee 将您的java-script 翻译成coffee-script

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2011-11-08
    • 2011-06-30
    相关资源
    最近更新 更多