Как я могу гарантировать, что все мои функции JavaScript возвращают значение? - PullRequest
3 голосов
/ 11 января 2012

У меня были многочисленные ошибки, происходящие только из-за отсутствия return в функции. Видите ли, когда большая часть кода, который вы пишете, написана на Ruby, легко забыть о явных возвращениях.

Так что я хотел бы использовать что-то похожее на JSlint (который я уже использую), чтобы проверить, что все функции возвращают что-то. Да, я думаю, что лучше явно возвращать что-то, когда в этом нет необходимости, чем выискивать пропущенные.

Итак, есть ли инструменты, которые проверяли бы возврат? Или, может быть, я могу утверждать это во время выполнения простым способом?

Пожалуйста, не предлагайте Coffeescript, я знаю о его существовании.

Ответы [ 4 ]

4 голосов
/ 11 января 2012

JSUnit пример:

<script language="javascript" src="jsUnitCore.js"></script>
<script language="javascript">
  function testWithValidArgs() {
      assertEquals("someFunction should return something", "Expected REturn Value", someFunction(2, 3));
  }
</script>
1 голос
/ 11 января 2012

Я не знаю ни одного инструмента, который сделает это из коробки. Но это было бы не сложно написать.

Начните с использования UglifyJS , чтобы проанализировать ваш код в синтаксическом дереве. Напишите рекурсивную функцию, которая проверяет весь код в поисках определений функций. Для каждой функции, которую вы найдете, посмотрите на последнее утверждение. Если это не оператор возврата, выведите предупреждение.

1 голос
/ 11 января 2012

Просто добавьте return последовательно. Но, честно говоря, JSlint - ОЧЕНЬ строгий инструмент проверки. Вы никогда не получите ошибок, если не возвращаете значения, если не пытаетесь определить переменную, используя ответ функции, но в этом случае добавление оператора return - это не просто логика.

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

0 голосов
/ 11 января 2012

(Слишком долго для комментария.)

Моя проблема с возвратом чего-либо, когда функция не имеет (значимого) возвращаемого значения, состоит в том, что она вводит в заблуждение, если только она не возвращает undefined, что противоречит цели.

Если я вижу return, я должен рассуждать о коде как в методе, так и на сайте вызова.

В функции, которую я должен определить, возвращает ли она что-нибудь еще, почемуон возвращает значение, которое он делает, и т. д. Единственный реальный способ обойти это - вернуть константу, которая дает понять, что это не действительно , возвращающий что-либо, это просто для удовлетворения желания вернуть что-то .

Если на сайте вызова игнорируется возвращаемое значение, мне нужно понять, почему, и если это нормально.Если я знаю, что каждая функция что-то возвращает, мне нужно проверить функцию, чтобы узнать, возвращает ли она это специальное значение, или пройти через описанный выше процесс.

Я бы почти предпочел пространство имен своих функций в "function" и"method" пространства имен в этой точке в качестве дифференциатора.Это позволило бы автоматизировать тестирование каждого пространства имен, чтобы убедиться, что все функции возвращают что-то полезное, все методы, в частности не , и предоставило бы подсказку на уровне источника относительно того, чего должен ожидать вызывающий объект.

...