JSLint жалуется на синтаксис пространства имен выражения функции - PullRequest
2 голосов
/ 31 октября 2011

Хорошо, я знаю, в чем разница между FunctionDeclaration и FunctionExpression.@ CMS проделали большую работу , объяснив это.До недавнего времени я использовал тот же синтаксис для создания лямбда-выражений и пространств имен по примеру Дугласа Крокфорда :

(function () {
    "use strict";
}());

Он оправдываетэто соглашение следующим образом:

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

Этот синтаксис отлично подходит для лямбда-выражений , потому что они возвращают значение.Однако пространства имен не возвращают значение.Поэтому теперь я предпочитаю использовать следующий синтаксис для пространств имен (взято из JavaScript Garden ):

(function () {
    "use strict";
})();

Дается обоснование использования этого синтаксисаследующим образом:

( // evaluate the function inside the paranthesis
function() {}
) // and return the function object
() // call the result of the evaluation

Использование этого синтаксиса для пространств имен имеет для меня больший смысл, поскольку: этот синтаксис разделяет пространство имен и вызов;и Синтаксис Дугласа Крокфорда ожидает, что функция вернет значение.

Однако, когда я передаю этот синтаксис через JSLint , я получаю сообщение об ошибке "Move the invocation into the parens that contain the function.",Я не понимаю, почему он жалуется на этот синтаксис.Это широко используемый и общепринятый синтаксис.

Я планирую уведомить Дугласа Крокфорда об этой проблеме.Однако, прежде чем я сделаю это, я буду признателен за любые ваши отзывы.Возможно, лучше просто придерживаться его синтаксиса?Пожалуйста, объясните ваши взгляды.

1 Ответ

1 голос
/ 29 июня 2012

Оглядываясь назад, я считаю, что взгляды Крокфорда - просто догма. Он говорит:

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

Что ж, мои аргументы в том, что когда функция вызывается немедленно, почему не ясно, что создаваемое значение является результатом функции, а не самой функции? Рассмотрим:

Получаемое значение является функцией:

var f = function () {
    "use strict;"
};

Получаемое значение является результатом функции:

var x = (function () {
    "use strict;"
})();

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

Понятно, что есть много программистов, которые по-прежнему переносят выражение функции в скобках, прежде чем присваивать его переменной, или кто-то садист и делает что-то подобное, чтобы сбить с толку Дуга:

var x = function () {
    "use strict;"
}();

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

var x = ~function () {
    "use strict;"
}();

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

var x = (f());

function f() {
    "use strict;"
}

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

...