簡體   English   中英

使用不返回任何內容的 return 語句有什么好處嗎?

[英]Is there a benefit to using a return statement that returns nothing?

我正在重構一個從開源項目中獲取的大型 JavaScript 文檔。 許多函數使用不一致的返回語句。 這是我的意思的一個簡單示例:

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

有時函數返回布爾值,有時返回字符串或其他東西。 通常它們與簡單的return;不一致地配對return; 條件中的語句。

問題是代碼很復雜。 它是一個解析器,它使用大量獨特的 RegEx 匹配,動態創建和銷毀 DOM 節點等。初步測試表明,在上面的示例中,我可以更改return; 語句變為return false; ,但我擔心我可能直到很久以后才意識到它對腳本產生了負面影響(即某些功能停止工作)。

所以我的問題是:使用空白的 return 語句有好處嗎? 這可能是故意以這種方式編碼還是只是懶惰? 我可以將它們全部更改為return false;return false; ,或return null; 或者我是否需要深入研究每個調用並找出他們對這些函數的結果做了什么?

使用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; 不檢查返回值的使用方式。

“空白返回”語句可用於將控制權轉移回調用函數(或由於某種原因停止執行函數 - 例如:驗證等)。 在大多數情況下,我在進行某種驗證時使用空白 return 語句。 但是,我強調設置一些指標來說明為什么停止執行函數。 例如,在帶有錯誤消息的 DIV 元素上設置“innerText”屬性。

在上面的代碼中,它看起來像是一個驗證。 如果一切順利,該函數將返回“true”。 看起來調用函數會解析返回值,如果為“true”,則執行下一步(在調用函數中)的語句。

在上面的示例中返回“false”而不是空白返回是一個好習慣。 這樣你就可以統一一切,讓其他程序員的生活更輕松。

您可以修復此類不一致; 但是,請確保徹底測試所有更改。 測試您對代碼所做的每項更改都是一種很好的做法,無論更改有多小。

這里可能丟失的(不是直接與您的示例)是您可以擁有一個三態對象:

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

return;之間完全沒有區別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]] 轉換為正常完成 w/value。 從代碼的末尾脫落是一個正常的完成spec )([[Call]] 確保為該值提供了undefined )。 但同樣,這是規范級別的差異,而不是在代碼中可以觀察到的東西。

改變你的函數實際上會改變代碼,因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM