【问题标题】:Why return true or false from functions?为什么从函数返回真或假?
【发布时间】:2015-10-05 06:44:47
【问题描述】:

我目前正在研究 Mikowski 和 Powell 的单页 Web 应用程序。在完成第 1 章中的简单教程后,我很困惑为什么在 toggleSlider()onClickSlider()initModule() 函数中需要 return truereturn false

这样做的额外好处是什么?当我在没有return truereturn false 的情况下运行以下代码时,它的工作方式与返回语句完全相同。

在什么情况下,有这些返回语句实际上是有益和必要的?

var spa = (function($) {
  var configMap = {
      extended_height: 434,
      extended_title: 'Click to retract',
      retracted_height: 16,
      retracted_title: 'Click to extend',
      template_html: '<div class="spa-slider"><\/div>'
    },
    $chatSlider,
    toggleSlider, onClickSlider, initModule;

  toggleSlider = function() {
    var slider_height = $chatSlider.height();

    if (slider_height === configMap.retracted_height) {

      $chatSlider
        .animate({
          height: configMap.extended_height
        })
        .attr('title', configMap.extended_title);
      return true;

    } else if (slider_height === configMap.extended_height) {
      $chatSlider
        .animate({
          height: configMap.retracted_height
        })
        .attr('title', configMap.retracted_title);
      return true;

    }

    console.log("Nothing to extend or retract. No events fired.");
    return false;
  };

  onClickSlider = function(event) {
    console.log("Calling onClickSlider click event");
    toggleSlider();
    return false;
  };

  initModule = function($container) {
    $container.html(configMap.template_html);

    $chatSlider = $container.find('.spa-slider');

    $chatSlider
      .attr('title', configMap.retracted_title)
      .click(onClickSlider);

    return true;
  };

  return {
    initModule: initModule
  };

}(jQuery));

jQuery(document).ready(
  function() {
    spa.initModule(jQuery('#spa'));
  }
);

body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: #777;
}
#spa {
  position: absolute;
  top: 8px;
  left: 8px;
  bottom: 8px;
  right: 8px;
  border-radius: 8px 8px 0 8px;
  background-color: #fff;
}
.spa-slider {
  position: absolute;
  bottom: 0;
  right: 2px;
  width: 300px;
  height: 16px;
  cursor: pointer;
  border-radius: 8px 0 0 0;
  background-color: #f00;
}

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <div id="spa">
        <div class="spa-slider"></div>
    </div>
</script>

【问题讨论】:

  • 据我所知,这些返回值毫无用处。我怀疑这只是作者的个人风格,他喜欢有明确的返回值。 toggleSlider 使用返回值来指示它是否执行了任何操作,这对于在控制台中进行调试可能很有用,尽管它也出于相同目的使用 console.log()
  • @nhgrif 我很抱歉。我收回对代码审查的引用。我的观点仍然存在,尽管这似乎也不是这里的主题,因为它不是在询问发布者在找到解决方案时遇到困难的特定问题。
  • @Claies 那么我建议找到一个接近的理由并投票支持它,或者否决它?您确定这个问题对于 SO 来说是题外话,但它的反对票为零,接近票为零。对我来说,这个问题似乎非常适合 SO,真的。
  • @nhgrif -- 我对我的问题的结构表示歉意。最近才开始使用 SO。以后会多加注意。感谢您的帮助和反馈。最好的!

标签: javascript c# jquery


【解决方案1】:

在我看来,您正在寻找一个真正没有规则的硬性规则。

你问“为什么”这条规则存在,而实际上它并不存在。

您仍在阅读 Mikowski 和 Powell 的单页 Web 应用程序第 1 章,我很高兴他们让您思考并注意到您的函数的返回值。

有许多可能的返回值 - truefalse 只是两个非常常见且非常重要的选项。

在更高级的函数中,您可能会发现自己返回 selfobject 任意数量的不同返回值 - 所有这些都取决于应用程序的架构和您的需要。

例如,在面向对象编程中,对于简单的函数返回self 变得越来越普遍。这允许您在一行中链接不同的功能......但是面向对象编程与第 1 章有什么关系?

我建议你给自己更多的时间和经验。现在,我建议你相信这个过程。 Mikowski 和 Powell 正在尽最大努力为您提供大量知识……但他们必须将其分成小块。

祝你好运!

【讨论】:

  • 投反对票,因为这绝不是试图回答这个问题。不过,这是一种美好的感觉!也许只是留下一个鼓舞人心的评论?
  • 嗨,亚历克斯,感谢您的反馈。但是,这确实通过说明问题的前提是错误的来回答问题。问题是“为什么 X 是真的”,答案是“X 不是真的”。
  • 嗨@Alex - 请查看我的评论并重新考虑。
  • 虽然我同意这是一个比 OP(或我自己,甚至)目前无法完全理解的更深层次的问题,但我不认为“相信过程”是技术人员的适当答案题。我们必须同意不同意这一点,尊重。 :)
【解决方案2】:

Javascript 函数中这样的返回值通常用于指示成功或失败。您可以通过执行以下操作来创建一个简单的流控制结构:

var doSomething = function() {
    if (error) { 
        return false; 
    } else { 
        return true; 
   }
};

if (doSomething()) { 
    doSomethingElse(); 
} else { 
    console.log("There was an error!"); 
}

也就是说,除了快速演示之外,将它用于其他任何事情都不是一个好主意。 return false 在纯粹以这种方式使用时会产生意想不到的结果而臭名昭著 - 几乎总是有更好的选择来实现您的目标(除非您的目标是返回一个布尔值!)。如果你只需要转义一个活动函数,你可以使用return;

在您的特定代码中,toggleSlider() 似乎返回这些值以指示活动,而 onClickSlider() 使用 return false 代替 e.preventDefault(),正如 Nicholas 在他们的回答中提到的那样。你可以在这里阅读更多关于为什么这通常是一个坏主意:http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/

【讨论】:

  • 很棒的文章参考。非常感谢。最好的!
【解决方案3】:

通常,在事件处理程序中,返回 false 是告诉事件实际上不触发的一种方式。因此,例如,在 onsubmit 的情况下,这意味着表单没有提交。

在您的示例中,return true; 将使动画发生,而 return false; 不会。

或者,您可以使用e.preventdefault() 而不是return false;

【讨论】:

  • 但是这些函数大部分都不是事件处理程序。
  • 您好 Nicholas,感谢您的回复。这消除了我的担忧。最好的!
猜你喜欢
  • 2014-09-07
  • 2021-11-05
  • 1970-01-01
  • 2019-10-15
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多