咖啡脚本理解

时间:2013-06-13 17:39:10

标签: javascript coffeescript

我是咖啡脚本的新手,所以我想知道我是否做得对。我在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的一些例子,但到目前为止还没有那么多运气。

3 个答案:

答案 0 :(得分:2)

  

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

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

  

是否正确应用了上下文,就像我仍在使用call

一样

不,因为你没有使用它。

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 :(得分:2)

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运算符的一种特殊形式,它允许您捕获元素的索引及其值。通常情况下,for .. in ..中的coffee-script运算符仅对元素进行操作,而不对其索引进行操作。

函数末尾的

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

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

您还可以使用js2coffeejava-script翻译为coffee-script

答案 2 :(得分:1)

我赞成Bergi的解释答案,但由于coffeescript参数可能有默认值,因此这里的版本稍微清晰一些。

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