LINUX.ORG.RU

Есть ли причины использовать function?

 


0

2

В современном JavaScript есть возможность объявлять функции стрелочными константами:

const myFunction = (x, y) => x + y;
// а не function myFunction(x, y) { return x + y; }
class MyClass {
  z = 1;

  myMethod = (x, y) => x + y + z;
  // а не myMethod(x, y) { return x + y + z }
}

У этого способа есть ряд преимуществ перед объявлением с помощью function или с помощью специальной конструкции в class: нет всякой непонятной лажи с this, не доступен arguments, имя myFunction нельзя случайно переназначить на другое значение, в myMethod this всегда указывает куда положено. Собственно какие могут быть причины НЕ делать так везде? Может быть производительность где-то просядет или ещё что неочевидное. Пока видны только плюсы.

★★★★★

Стрелочный синтаксис доступен только в стандарте ecma script 6, который поддерживается почти никак. Если не используешь препроцессоры/компляторы/тайпскрипт/етц, то выбора-то и нет.

nikolnik ★★★
()

Это синтаксис из ES6, который применяется не всеми.

blackst0ne ★★★★★
()
Ответ на: комментарий от nikolnik

Как это ? Es6 сейчас поддерживают все браузеры в разной степени, например стрелочные функции вполне можно писать https://caniuse.com/#feat=arrow-functions

ism ★★★
()
Последнее исправление: ism (всего исправлений: 1)
Ответ на: комментарий от Deleted

А для чего нужен непостоянный this? Вот я пишу a.b — это нормально. Все остальные варианты от лукавого, имхо.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Пишешь такой, а this у тебя всегда на window указывает. Ляпота.

ritsufag ★★★★★
()

иногда хочется сделать неанонимную лямбду (например, чтобы сделать «одноразовый» event listener

ещё, например, в jquery в качестве this в функцию подставляется текущий элемент, что удобно

ещё function объявляются назад как var'ы, тоже иногда удобно

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y

иногда хочется сделать неанонимную лямбду (например, чтобы сделать «одноразовый» event listener

Не понял.

Legioner ★★★★★
() автор топика

Не знаю, когда я вижу многоэтажные калбяки с этими стрелочками, хочется убивать хипсторов. Эпичная каша получается похуже чем ехал function через function. Вот и ты туда же, хочешь лепить стрелочки где надо и не надо.

bread
()
Ответ на: комментарий от f1u77y

Два чаю этому анимуфагу.
d3 тоже биндит свой мифический this в передаваемую в него лямбду.
Так что там бывает нужно использовать function.

Deleted
()
Ответ на: комментарий от Legioner

Что бы потом removeEventListener нормально отработал.

Deleted
()
Ответ на: комментарий от f1u77y

Хитро, хотя никто не мешает вынести его в переменную.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от bread

Ну вот и объясни, почему не надо, если с ними лучше.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Блин, вот у меня сейчас архаичная система сборки на галпе, сейчас переехать нифига нетривиально. Вот и приходиться выживать пока так.

nikolnik ★★★
()

синтаксический зоопарк -> Есть ли причины использовать JavaScript?

anonymous
()

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

aiive
()

Есть ли смысл не использовать нечитаемые однострочники?

Shadow ★★★★★
()
Ответ на: комментарий от aiive

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

хм, а это разве связано со стрелочной функцией?

function Tree(name) {
  this.name = function() {...};
}
function Tree(name) {
  this.name = () => {...};
}

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

anonymous
()
Ответ на: комментарий от anonymous

В этом случае да. Он имел в виду, что если объявлять как

class MyClass {
  f() { ... }
}
то указатель на функцию будет в прототипе, общим для всех объектов этого класса.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.