1

更新:我的问题是由返回的两个函数引起的,而不仅仅是一个。$.each循环中的回调函数在if/else块中生成返回。尽管我稍后在问题中链接它,但有一个很好的问题是关于如何在 CoffeeScript 编译为 JavaScript 时覆盖返回。这不是该问题的重复;我有一个更具体的问题。

我正在尝试通过将我在 JavaScript 中所做的一些工作与jQuery Widget Factory一起移植来学习 CoffeeScript 以获得乐趣。假设$foos是一个布尔数组。我有一个类似于此的 CoffeeScript 函数:

$ = jQuery

activateCats = ($foos) ->   
   $.each $foos, (idx, foo) ->
      $bar = $(".cats").eq(idx)
      if foo
         $bar.addClass("ui-state-active")
            .removeClass "ui-state-disabled"
      else
         $bar.removeClass("ui-state-active")
            .addClass "ui-state-disabled"
      # add another empty return here
   return

编译后的 JavaScript 如下所示:

var $, doThings;

$ = jQuery;

activateCats = function($foos) {      // Function 1
   $.each($foos, function(idx, foo) { // Function 2
      var $bar;

      $bar = $(".cats").eq(idx);
      if (foo) {
         return $bar.addClass("ui-state-active").removeClass("ui-state-disabled");
      } else {
         return $bar.removeClass("ui-state-active").addClass("ui-state-disabled");
      }
   });
};

如果我不包括底部的返回,它会编译成这个(注意我的$.each循环前面的返回):

var $, doThings;

$ = jQuery;

activateCats = function($foos) {
   return $.each($foos, function(idx, foo) {
      var $bar;

      $bar = $(".cats").eq(idx);
      if (foo) {
         return $bar.addClass("ui-state-active").removeClass("ui-state-disabled");
      } else {
         return $bar.removeClass("ui-state-active").addClass("ui-state-disabled");
      }
   });
};

我很确定我不希望这些回报出现在我的$.each循环中。我不确定 CoffeeScript 为什么要添加它们,因为我的return函数底部是空的。我之前在其他地方遇到过这个问题,但我阅读了这个帖子并解决了这些问题。我已经尝试了该线程中的各种方法,但它们似乎都不适用于这种边缘情况。

如何防止 CoffeeScript 添加这些返回值?

4

1 回答 1

0

As mentioned here:

activateCats = ($foos) ->   
   $.each $foos, (idx, foo) ->
      $bar = $(".cats").eq(idx)
      if foo
         $bar.addClass("ui-state-active")
            .removeClass "ui-state-disabled"
         return
      else
         $bar.removeClass("ui-state-active")
            .addClass "ui-state-disabled"
         return
   return

Will compile to:

var activateCats;
activateCats = function($foos) {
  $.each($foos, function(idx, foo) {
    var $bar;

    $bar = $(".cats").eq(idx);
    if (foo) {
      $bar.addClass("ui-state-active").removeClass("ui-state-disabled");
    } else {
      $bar.removeClass("ui-state-active").addClass("ui-state-disabled");
    }
  });
};
于 2013-05-16T14:37:09.017 回答