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

Правильное использование const для определения функций в JavaScript

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

const doSomething = () => {
   ...
}

Должны ли быть определены все функции в ES6? Похоже, что это не произошло, если да.

Спасибо за любые комментарии!

4b9b3361

Ответ 1

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

Объявление функции, то есть:

function doSomething () {}

Поднимается полностью к вершине области видимости (и, как и let и const, они также обламываются блоками).

Это означает, что будет работать следующее:

doSomething() // works!
function doSomething() {}

Выражение функции, то есть:

[const | let | var] = function () {} (or () =>

Является ли создание анонимной функции (function () {}) и созданием переменной, а затем назначением этой анонимной функции этой переменной.

Таким образом, обычные правила, связанные с перемещением переменных в переменных с областью видимости - блок-областью (let и const), не поднимаются как undefined в верхней части области его блока.

Это означает:

if (true) {
    doSomething() // will fail
    const doSomething = function () {}
}

Ошибка, так как doSomething не определен. (Он будет бросать ReferenceError)

Если вы переключитесь на использование var, вы получите свой подъем переменной, но она будет инициализирована на undefined, чтобы блок кода выше все еще не работал. (Это вызовет TypeError, так как doSomething не является функцией в момент ее вызова)

Что касается стандартных практик, вы всегда должны использовать подходящий инструмент для работы.

Axel Rauschmayer имеет отличную должность в области и подъеме, включая семантику es6: Переменные и Scoping в ES6

Ответ 2

Хотя использование const для определения функций кажется взломом, но оно имеет некоторые большие преимущества, которые делают его превосходным (на мой взгляд)

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

  • Вы можете использовать синтаксис сильной стрелки, который короче и чище.

  • Использование функций стрелок выполняет привязку this для вас.

пример с function

// define a function
function add(x, y) { return x + y; }

// use it
console.log(add(1, 2)); // 3

// oops, someone mutated your function
add = function (x, y) { return x - y; };

// now this is not what you expected
console.log(add(1, 2)); // -1

Ответ 3

Есть несколько очень важных преимуществ использования const, и некоторые говорят, что его следует использовать везде, где это возможно, из-за того, насколько это преднамеренно и показательно.

Это, насколько я могу судить, самое показательное и предсказуемое объявление переменных в Javascript, и одно из самых полезных, ПОТОМУ ЧТО СЛОЖНО. Зачем? Поскольку он устраняет некоторые возможности, доступные для var и пусть объявления.

Что вы можете сделать, когда читаете "const"? Вы знаете все следующее, просто прочитав инструкцию объявления const, И без проверки других ссылок на эту переменную: значение привязано к этой переменной (хотя ее основной объект не является глубоко неизменным); он не может быть доступен за пределами его непосредственно содержащего блока; и привязка никогда не открывается до объявления из-за правил временной зоны мертвой зоны (TDZ).

Из статьи, аргументирующей преимущества let и const, а также более непосредственно отвечает на ваш вопрос о ограничениях/ограничениях ключевого слова:

"Ограничения, такие как те, которые предлагаются let и const, являются мощным способом упрощения понимания кода. Постарайтесь набрать как можно больше из этих ограничений в коде, который вы пишете. Чем больше декларативных ограничений, ограничивающих код может означать, что проще и быстрее для людей читать, анализировать и понимать часть кода в будущем.

Предоставлено. Больше правил для объявления const, чем для объявления var: block-scoped, TDZ, присваивание при объявлении, без переназначения. Принимая во внимание, что выражения var только определяют функцию функции сигнала. Однако подсчет правил не дает большого понимания. Лучше взвесить эти правила с точки зрения сложности: добавляет ли правило или вычитает сложность? В случае с константой определение области кадра означает более узкую область видимости, чем функция, TDZ означает, что нам не нужно сканировать область назад из декларации, чтобы определить использование до объявления, а правила назначения означают, что привязка всегда сохраняет тот же ссылка.

Чем более сдержанные утверждения, тем проще становится часть кода. Поскольку мы добавляем ограничения на то, что может означать утверждение, код становится менее непредсказуемым. Это одна из самых больших причин, почему статически типизированные программы, как правило, легче читать, чем динамически типизированные. Статическая типизация накладывает большое ограничение на писателя программы, но также создает большое ограничение на то, как программа может быть интерпретирована, что делает ее код более понятным.

С учетом этих аргументов рекомендуется использовать константу, где это возможно, как ее выражение, которое дает нам наименьшие возможности для размышлений.

Источник: https://ponyfoo.com/articles/var-let-const

Ответ 4

Это довольно уродливо, чтобы сделать это таким образом, но это, безусловно, верно.

Где я работаю, я разработал простой класс factory, который принимает объект parent и массив функций, а затем предоставляет эти функции родителям через геттеры с помощью defineProperty.

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

Самое главное - быть последовательным в вашем проекте. Соберите членов вашей команды и дайте четкие соглашения о том, как вы это сделаете.

Ответ 5

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

const FLAG_ONE   = 1;
const FLAG_TWO   = 2;
const FLAG_THREE = 4;
// etc.

// resolves flag into string for debugging purposes:
const FLAG_NAME = flag => {
    switch ( flag ) {
        case FLAG_ONE: return 'one';
        // etc.
    }
};

Не нужно каким-либо образом определять FLAG_NAME как константу, но это улучшит читаемость вашего кода.

Ответ 6

Стефан Бэйзитер говорит
© Это довольно уродливо, чтобы сделать это таким образом.

const foo = (a, _foo, b) => _foo(a, a, b)
const bar = (a, b, c) => (c - 1) ? bar((a * b), b, (c - 1)) : a

alert(
  foo(3, bar, 4)
)