JSLint жалуется на синтаксис пространства имен выражения выражения выражения

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

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

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

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

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

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

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

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

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

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

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

+2
источник поделиться
1 ответ

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

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

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

Получаемое значение - это функция:

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

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

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

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

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

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

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

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

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

var x = (f());

function f() {
    "use strict;"
}

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

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос