Як записати названу функцію стрілки в ES2015?
Ви робите це так, як ви вирішили у своєму запитанні: ви розміщуєте його в правій частині завдання або ініціалізатора властивостей, де змінна або ім'я властивості може розумно використовуватись як ім'я двигуном JavaScript. Немає іншого способу зробити це, але зробити це правильно і повністю охоплено специфікацією.
За специфікацією ця функція має справжнє ім'я sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Це визначено в Операторах присвоєння> Семантика виконання: Оцінка, коли вона викликає абстрактну SetFunctionName
операцію (цей виклик зараз знаходиться на етапі 1.e.iii).
Similiarly, Runtime Semantics: PropertyDefinitionEvaluation викликає SetFunctionName
і таким чином дає цій функції справжнє ім'я:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
Сучасні двигуни встановлюють внутрішню назву функції для таких операторів; Edge все ще має біт, який робить його доступним, як name
на екземплярі функції за прапором виконання.
Наприклад, у Chrome або Firefox відкрийте веб-консоль і запустіть цей фрагмент:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
У Chrome 51 і новіших версіях, Firefox 53 і вище (і на Edge 13 і вище з експериментальним прапором), коли ви запустите це, ви побачите:
foo.name: foo
Помилка
в foo (http://stacksnippets.net/js:14:23)
за адресою http://stacksnippets.net/js:17
Зверніть увагу на foo.name is: foo
і Error...at foo
.
У Chrome 50 і новіших версіях, Firefox 52 і новіших версіях, і Edge без експериментального прапора, ви побачите це замість цього, оскільки вони не мають Function#name
властивості (поки):
foo.name:
Помилка
в foo (http://stacksnippets.net/js:14:23)
за адресою http://stacksnippets.net/js:17
Зверніть увагу , що ім'я відсутнє foo.name is:
, але це буде показано в трасуванні стека. Просто реальна реалізація name
властивості функції мала нижчий пріоритет, ніж деякі інші функції ES2015; У Chrome і Firefox зараз є; Edge має його за прапором, імовірно, він не буде позаду прапора набагато довше.
Очевидно, я можу використовувати цю функцію лише після того, як я її визначив
Правильно. Не існує синтаксису оголошення функцій для функцій стрілок, лише синтаксис вираження функцій , і немає стрілки, еквівалентної імені, у старому стилі з іменем виразу функції ( var f = function foo() { };
). Тож немає еквівалента:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
Ви повинні розбити його на два вирази (я б заперечував, ви все одно повинні це робити ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
Звичайно, якщо вам потрібно поставити це там, де потрібен єдиний вираз, ви завжди можете ... використовувати функцію стрілки:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
Я не кажу, що це досить, але це працює, якщо вам абсолютно позитивно потрібна обгортка з одним виразом.