如何在我的 if/else 块中防止这些不需要的返回?

Posted

技术标签:

【中文标题】如何在我的 if/else 块中防止这些不需要的返回?【英文标题】:How do I prevent these unwanted returns in my if/else block? 【发布时间】:2013-05-11 12:12:01 【问题描述】:

更新:我的问题是由两个函数返回引起的,而不仅仅是一个。 $.each 循环中的回调函数在 if/else 块中生成返回。即使我稍后在问题中链接它,当 CoffeeScript 编译为 javascript 时,还有一个关于 how to override returns 的好问题。这不是该问题的重复;我有一个更具体的问题。

我正在尝试通过使用jQuery Widget Factory 移植我在 JavaScript 中所做的一些工作来学习 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。我以前在其他地方遇到过这个问题,但我读了this thread 并解决了这些问题。我已经尝试了该线程中的各种方法,但它们似乎都不适用于这种边缘情况。

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

【问题讨论】:

Is there any way to not return something using CoffeeScript?的可能重复 这个问题之前已经回答过了。 @TheHippo 如果你阅读了这个问题的最后两句话,你会发现我已经尝试了这些解决方案,但它们没有用。 【参考方案1】:

如上所述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

将编译为:

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");
    
  );
;

【讨论】:

对于另一个问题的答案,我不清楚在 CoffeScript 尝试编译返回的任何地方都必须放置一个空返回。它是否经常应用返回(在循环和逻辑块中),以便您可以有选择地用空返回关闭它们? 不,你不能。正如 CoffeeScript 文档引用的那样:“一切都是表达式(至少,尽可能地)”。在大多数情况下,它不会造成任何伤害。 好的,我是语法新手,但我正在尝试弄清楚。感谢您回答我的问题,而不仅仅是将其作为重复而写下来。这是一件简单的事情,但对我来说这是一个与其他线程不同的特质。 @CaesiumFarmer 我认为您误解了正在发生的事情。您也可以通过在 if/else 块之后放置一个 return 来解决这个问题。最后 return 没有这样做的原因是您有 2 个函数,而您的返回值在外部函数中。在 CoffeeScript 中,每个函数都会返回其中的最后一个表达式。

以上是关于如何在我的 if/else 块中防止这些不需要的返回?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用三元运算符返回字符串与在等效 if/else 块中返回的代码有很大不同?

设计模式-策略模式Strategy以及消灭if else

在我的 if else 语句中使用用户输入的一些帮助

如何在 JavaScript 中编写没有“else”的 IF else 语句 [关闭]

使用 if/else 的过程

如何防止健康检查请求在我的数据库中存储不需要的会话?