如何在我的 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 块中返回的代码有很大不同?