Есть ли польза от использования оператора 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;
или мне нужно прорыть каждый звонок и узнать, что они делают с результатами этих функций?
Ответы
Ответ 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