使用不返回任何内容的 return 语句有啥好处吗?

Posted

技术标签:

【中文标题】使用不返回任何内容的 return 语句有啥好处吗?【英文标题】:Is there a benefit to using a return statement that returns nothing?使用不返回任何内容的 return 语句有什么好处吗? 【发布时间】:2011-04-12 15:47:30 【问题描述】:

我正在重构一个从开源项目中挑选的大型 javascript 文档。许多函数使用不一致的返回语句。这是我的意思的一个简单示例:

var func = function(param) 
    if (!param) 
        return;
    
    // do stuff
    return true;

函数有时返回布尔值,有时返回字符串或其他内容。通常它们与条件内的简单return; 语句配对不一致。

问题是代码很复杂。它是一个使用大量唯一 RegEx 匹配、动态创建和销毁 DOM 节点等的解析器。初步测试表明,在上面的示例中,我可以将 return; 语句更改为 return false;,但我'我担心直到很久以后我才意识到它对脚本有负面影响(即某些功能停止工作)。

所以我的问题是:使用空白退货声明有什么好处吗?这可能是故意这样编码的还是只是懒惰?我可以将它们全部更改为return false;return null;,还是我需要深入研究每个调用并找出它们对这些函数的结果做了什么?

【问题讨论】:

我确实发现,如果我明确返回 true 或 false 逻辑,我会在维护周期中停下来思考更少,但正如其他人所说,确保在全面更改之前使用功能。 【参考方案1】:

使用不带值的return 将返回值undefined

如果该值被评估为布尔值,undefined 将作为false 工作,但如果将该值与false 进行比较,您将得到不同的行为:

var x; // x is undefined
alert(x); // shows "undefined"
alert(!x); // shows "true"
alert(x==false); // shows "false"

因此,虽然代码应该在逻辑上返回 truefalse,而不是 trueundefined,但您不能只将 return; 更改为 return false; 而不检查返回值的使用方式。

【讨论】:

@Stephen 请注意,这并不意味着您可以将其更改为return undefined;,因为这意味着返回未定义的全局变量,直到最近的浏览器都可以。 @user1:我知道undefined“常量”并不是真正的常量(我什至在博客上写过),但我不知道这会改变吗? EcmaScript 规范有变化吗? @Guffa 是的,它在 ECMAScript 5 中发生了变化。参见 15.1.1.3 部分,全局对象的值 undefined 不可写。 InfinityNaN 的值也是如此。 @DavidSpector:我回滚了你的编辑。代码的重点不是检查未定义,因为我们已经知道该值是未定义的,而是显示检查布尔值的不同方法如何处理未定义的值。【参考方案2】:

“空白返回”语句可用于将控制权转移回调用函数(或由于某种原因停止执行函数 - 例如:验证等)。在大多数情况下,我在进行某种验证时使用空白返回语句。但是,我强调要设置一些指标来说明函数执行停止的原因。例如,在带有错误消息的 DIV 元素上设置“innerText”属性。

在上面的代码中,它看起来像是一个验证。如果一切顺利,该函数将返回“true”。看起来调用函数解析返回值,如果它是“真”,则执行下一步语句(在调用函数中)。

在上面的示例中,最好返回“false”而不是空白返回。这样一来,您就可以使一切变得统一,并使其他程序员的生活变得轻松。

您可以修复此类不一致;但是,请确保彻底测试所有更改。测试您对代码所做的每项更改都是一个好习惯,无论更改多么小。

【讨论】:

【参考方案3】:

这里可能会丢失(不是直接用你的例子)是你可以拥有一个三态对象:

var myfunc = function(testparam) 
    if (typeof testparam === 'undefined') return;
    if (testparam) 
        return true;
    
    else 
        return false;
    
;

var thefirst = myfunc(true)
var thesecond = myfunc(false);
var thelast = myfunc();
alert("type:" + typeof thefirst+" value:"+thefirst);
alert("type:" + typeof thesecond+" value:"+thesecond);  
alert("type:" + typeof thelast+" value:"+thelast); 

这些返回:

> type:boolean:true 
> type:boolean:false
> type:undefined:undefined

注意:在本例中,null 将返回 false myfunc(null);

【讨论】:

这个答案已有 6 年历史,没有人做出以下观察,所以也许我没有正确理解“注释”的预期解释。话虽如此,myfunc(null) 将返回 false,而不是 undefined。 @bryonbean 顶部的这一行:if (typeof testparam === 'undefined') return; 这是从if (testparam === undefined) return; 编辑的,但原则仍然适用 @MarkSchultheiss:这不正确;在使用严格比较运算符 (===) 时,在 javascript 中 null 不等于 undefined。尽管进行了编辑,null === undefined 始终评估为 false。但是null == undefined 将评估true。也许原始答案中使用了非严格运算符? @bryonbean - 是的,你是对的,我误读了你的评论(没有任何借口)我会更正这一点..谢谢代码可能是错误的,不管它有多旧 :)【参考方案4】:

return;return undefined; 之间没有任何区别。调用这两个函数的结果是接收到值undefined

(以return 终止的函数体与仅从代码末尾脱落的函数体之间存在非常小的规范级别差异,但这没什么可以在代码中检测到。¹调用执行落在代码末尾的函数也会导致值undefined。)

"use strict";

// Implicit return of `undefined`
function x() 
    return;

// Explicit return of `undefined`
function y() 
    return undefined;

// Execution falls off the end
function z() 

console.log(typeof x() === "undefined"); // true
console.log(typeof y() === "undefined"); // true
console.log(typeof z() === "undefined"); // true

除非,当然,undefined 受到了影响。遗憾的是,这仍然是可能的(尽管很高兴,在全球范围内不是)。在那种非常前卫的边缘情况下,情况有所不同:

"use strict";
(function() 
    const undefined = 42;
//  ^^^^^^^^^^^^^^^---- shadowing `undefined`
    // Implicit return of `undefined`
    function x() 
        return;
    
    // Explicit return of `undefined`
    function y() 
        return undefined;
    
    // Execution falls off the end
    function z() 
    
    console.log(typeof x() === "undefined"); // true, `x` returns the canonical `undefined`
    console.log(typeof y() === "undefined"); // false, `y` returns 42
    console.log(typeof z() === "undefined"); // true, `z` (effectively) returns the canonical `undefined`
)();

¹ 使用return 是一个突然完成,[[Call]] 将其转换为带值的正常完成。落在代码末尾的是 正常完成 (spec)([[Call]] 确保为值提供 undefined)。但同样,这是规范级别的差异,而不是在代码中可观察到的。

【讨论】:

Crowder 先生,您好,抱歉,我只是想问您一个问题,即 return 语句在幕后是如何工作的。如果我们有这段代码, let car = function()return "engine" when "engine is returned",是不是有点替换函数声明))),也就是说,函数声明被替换为“engine”。我们将有这样的代码让汽车=“引擎”。当我们返回某些东西时,它会在幕后发生吗?【参考方案5】:

更改函数实际上会改变代码,因为return;return false; 输出不同的数据类型。

var test = function (x) 
    if (!x) 
        return;
    
    else 
        return false;
    
;

var a = test(true), b = test(false);

console.log(typeof b); // undefined
console.log(typeof a); // boolean

【讨论】:

以上是关于使用不返回任何内容的 return 语句有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

在流水线函数中包含“return”关键字有啥好处?

c语言exit和return有啥区别

根据 Python 标准,如果函数不返回任何内容,我们是不是需要“return”语句 [重复]

React - 错误:App(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null

错误:导航(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null

× 错误: Header(...): 渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null