Подтвердить что ты не робот

Есть ли польза от использования оператора return, который ничего не возвращает?

Я рефакторинг большого документа javascript, который я взял из проекта с открытым исходным кодом. В ряде функций используются несогласованные операторы return. Вот простой пример того, что я имею в виду:

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

Иногда функции возвращают логические, иногда строки или другие вещи. Обычно они непоследовательны в сочетании с простым выражением return; внутри условного выражения.

Проблема в том, что код является сложным. Это парсер, который использует множество уникальных совпадений RegEx, создает и уничтожает узлы DOM на лету и т.д. Предварительное тестирование показывает, что в приведенном выше примере я мог бы изменить оператор return;, чтобы стать return false;, но я Мне кажется, что я не могу понять, что это негативно повлияло (например, какая-то функция перестала работать) на script до намного позже.

Итак, мои вопросы: есть ли смысл использовать пустой оператор возврата? Может ли это быть преднамеренно закодировано таким образом или было просто лениво? Могу ли я изменить их все на return false; или return null; или мне нужно прорыть каждый звонок и узнать, что они делают с результатами этих функций?

4b9b3361

Ответ 1

Использование return без значения вернет значение undefined.

Если значение оценивается как логическое значение, undefined будет работать как false, но если значение, например, сравнивать с false, вы получите другое поведение:

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

Итак, хотя код должен логически возвращать true или false, а не true или undefined, вы не можете просто изменить return; на return false;, не проверив, как используется возвращаемое значение.

Ответ 2

Операторы "Пустой возврат" могут использоваться для передачи управления обратно вызывающей функции (или по какой-либо причине прекратить выполнение функции - ex: проверки и т.д.). В большинстве случаев я использую пустой оператор return, когда я делаю какую-то проверку. Однако я хотел бы указать некоторый индикатор того, почему выполнение функции остановлено. Например, установите свойство "innerText" в элементе DIV с сообщением об ошибке.

В приведенном выше коде это похоже на проверку. Функция возвращает "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

note: null вернет false в этом примере myfunc (null);

Ответ 4

Изменение ваших функций фактически изменит код, потому что return; и return false; выводят разные типы данных.

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

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

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

Ответ 5

Там нет никакой разницы между 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