Чому ES6 не має функцій тонкої стрілки?


16

ES6 додав функції жирової стрілки ( =>), які мають дві основні відмінності від звичайних функцій:

  • коротший синтаксис (включаючи неявне повернення, якщо ви використовуєте тіло з одним виразом)
  • успадковувати thisз навколишнього сфери

Це обидві дуже корисні функції, але мені здаються абсолютно окремими за своєю цінністю та застосуванням - іноді мені хочеться одного, або іншого, або обох, або жодного. Здається дивним , що , якщо я хочу використовувати функцію захисту від короткого синтаксису, я є також використовувати this-modifying поведінку. І навпаки. Я не бачу, чому ці дві можливості реалізуються як єдине доповнення до мови.

Що робити, якщо я хочу використовувати коротку функцію синтаксису для її неявного повернення та стислості (в якомусь контексті, коли повна function (..) { return ...}буде трохи менш читабельною), але я хочу використовувати thisу своїй функції для позначення виклику контексту? Немає цього зробити.

CoffeeScript має ->і =>функції, і стиль, і, мабуть, ES6 запозичив =>стиль звідти. Отже, моє запитання: чому ES6 також не запозичив ->стиль?


жиру стрілкою функція має інші відмінності, як вони не зв'язується можуть argumentsнебудь.
DeadMG

Якщо часом все, що вам потрібно, - це оточуюча область, ви завжди можете прив’язати thisдо закриття в повному обсязі декларації функції. Це може бути не тією частиною, яка вас турбує.
Бен

Відповіді:


25

Див. Пропозицію додати функції стрілок: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

Що там сказано:

Однак, ми не хочемо, щоб CoffeeScript ->, це заплутано, щоб було дві стрілки, і динамічна ця прив'язка - це часто запущений пістолет.

Ви також можете побачити деяке обговорення попередньої версії пропозиції, яка також мала синтаксис ->: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Схоже, це зводиться до наступного:

  1. Наявність двох синтаксисів стрілок з тонко різною семантикою збільшило б складність і розгубленість.
  2. Динамічний цей зв'язок функції () і ->вважався рідко корисним, і пістолет для ніг.
  3. Якщо вам дійсно потрібна динамічна ця прив'язка, ви все одно можете використовувати функцію (), оскільки синтаксис швидкого доступу не був дуже корисним.

1
+1. Конкретно зауважте, що ES6 є другою спробою впровадження цих функцій, які спочатку планувались включити до ES4, але специфікація була відмовлена, коли стало зрозуміло, що основні зацікавлені сторони вважають, що це занадто складно і може порушити зворотну сумісність. Зробити все максимально простим, напевно, це було важливою метою комітету цього разу.
Жуль

1
Дякую за вашу відповідь, але я не думаю, що це охоплює. Менше не означає простіше; Я можу стверджувати, що складніше перемикатися між двома синтаксисами дуже різних функцій лише для того, щоб отримати таку логіку прив'язки (порівняно з переключенням одного символу). Наявність "декількох типів функцій з різною семантикою" - не страшна ідея; це саме те, що ми маємо насправді. І я не бачу, яка сумісність має відношення до всього, про що ми говоримо. Я не припускаю, що вони мали б зняти підтримку синтаксису класичної функції, якщо це ви маєте на увазі
callum

2
@callum, консенсус (принаймні серед людей, які приймають це рішення) полягає в тому, що function()стиль цього прив'язки був помилкою і є бородавкою мови. Якби вони могли, вони змінили function()б =>семантику, але не можуть, тому що це порушить зворотну сумісність.
Вінстон Еверт

2
@WinstonEwert затримайтеся, ви хочете сказати, що люди, які приймають рішення, воліли б, якби вони могли змінити function()спадщину thisз оточуючої сфери, як =>це робиться? У такому випадку, чи не thisпросто скрізь посилатиметься на глобальний об’єкт? Звучить дивно. Де ти це чув?
callum

3
На це може бути прийнята відповідь, але це здається поганим дизайном мови. Якщо у вас мова, яка потребує жирної стрілки, то має бути доступна і тонка стрілка. Перший змушує всіх почати мислити над предметами, тоді як другий спочатку визнає історію функціонування дизайну і відкладений контекст.
Основний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.