У меня есть функция, которую я пытаюсь преобразовать в новый синтаксис стрелки в ES6 . Это именованная функция:
function sayHello(name) {
console.log(name + ' says hello');
}
Есть ли способ дать ему имя без оператора var:
var sayHello = (name) => {
console.log(name + ' says hello');
}
Очевидно, что я могу использовать эту функцию только после того, как я ее определил. Что-то вроде следующего:
sayHello = (name) => {
console.log(name + ' says hello');
}
Есть ли новый способ сделать это в ES6 ?
Ответы:
Вы делаете это так, как исключили в своем вопросе: вы помещаете его в правую часть инициализатора присваивания или свойства, где имя переменной или свойства может быть разумно использовано в качестве имени движком JavaScript. Нет другого способа сделать это, но это правильно и полностью отражено в спецификации.
По спецификации у этой функции есть настоящее имя
sayHello
:Это определено в Операторы присваивания> Семантика времени выполнения: оценка, где она вызывает абстрактную
SetFunctionName
операцию (этот вызов в настоящее время находится на шаге 1.e.iii).Аналогично, семантика времени выполнения: PropertyDefinitionEvaluation вызывает
SetFunctionName
и, таким образом, дает этой функции истинное имя:Современные движки уже устанавливают внутреннее имя функции для таких операторов; У Edge все еще есть бит, делающий его доступным как
name
на экземпляре функции позади флага времени выполнения.Например, в Chrome или Firefox откройте веб-консоль и запустите этот фрагмент:
На Chrome 51 и выше и Firefox 53 и выше (и Edge 13 и выше с экспериментальным флагом), когда вы запустите это, вы увидите:
Обратите внимание на
foo.name is: foo
иError...at foo
.В Chrome 50 и более ранних версиях, Firefox 52 и более ранних версиях и Edge без экспериментального флага вы увидите это вместо этого, потому что у них нет
Function#name
свойства (пока):Обратите внимание , что имя отсутствует
foo.name is:
, но это будет показано в трассировке стека. Просто на самом деле реализацияname
свойства функции имела более низкий приоритет, чем некоторые другие функции ES2015; Chrome и Firefox теперь есть; У Эджа есть это позади флага, вероятно, это не будет позади флага намного дольше.Верный. Не существует синтаксиса объявления функций для функций стрелок, только синтаксис выражений функций , и нет стрелки, эквивалентной имени в названном выражении функции старого стиля (
var f = function foo() { };
). Так что нет эквивалента:Вы должны разбить его на два выражения (я бы сказал, что вы должны это делать в любом случае ) :
Конечно, если вам нужно поместить это туда, где требуется одно выражение, вы всегда можете ... использовать функцию стрелки:
Я не говорю, что это красиво, но это работает, если вам абсолютно и безусловно нужна единая оболочка для выражений.
источник
let f = () => { /* do something */ };
присваивая имя функции,let g = (() => () => { /* do something */ })();
нет.o.foo = () => {};
не дает функции имя. Это было сделано специально для предотвращения утечки информации.Нет. Синтаксис стрелки является сокращением для анонимных функций. Анонимные функции, ну, в общем, анонимные.
Именованные функции определяются с помощью
function
ключевого слова.источник
SetFunctionName
операция .let a = () => {};
определяет именованную функцию (имя естьa
) как в соответствии со спецификацией, так и в современных движках (добавьте в нее ошибку, чтобы увидеть); они просто еще не поддерживаютname
собственность (но она есть в спецификации, и они в конце концов доберутся до нее).Если под именем named вы имеете в виду, что хотите, чтобы
.name
свойство функции стрелки было установлено, вам повезло.Если функция стрелки определена в правой части выражения присваивания, движок возьмет имя слева и использует его для установки функций стрелки
.name
, напримерСказав это, ваш вопрос, кажется, больше «могу ли я получить функцию стрелки, чтобы поднять?». Боюсь, ответом на этот вопрос будет большое «нет».
источник
name
свойств везде, где этого требует спецификация ES2015; они доберутся до этого. Это одна из последних вещей в списке соответствия для Chrome, и даже в Chrome 50 его нет (Chrome 51, наконец, будет). Подробности . Но ОП специально исключил это (причудливо).Похоже, что это будет возможно с ES7: https://babeljs.io/blog/2015/06/07/react-on-es6-plus#arrow-functions
Приведенный пример:
Обратите внимание, что для работы с babel мне нужно было включить самый экспериментальный синтаксис ES7 stage 0. В моем файле webpack.config.js я обновил загрузчик babel следующим образом:
источник
this.handleOptionsButtonClick = this.handleOptionsButtonClick.bind(this);
constructor() { this.handleOptionsButtonClick = (e) => {…}; }
который полностью эквивалентен коду в вашем ответе, но уже работает в ES6. Не нужно использовать.bind
.this
контекстом»let a = () => {};
определяет именованную функцию стрелки с именемa
. Подробности .На самом деле, похоже, что один из способов назвать функции стрелок (по крайней мере, в chrome 77 ...) - это сделать это:
источник
fn('yourName', ()=>{})
, который может поддерживать 100% правильно стрелку функции семантики, или еще лучше в Вавилонском плагином для «имени синтаксиса функции стрелки»:fn yourName() => {}
. Любой из них будет компилироваться до кода выше. Я думаю, что названные стрелки были бы такими BADA55чтобы написать именованную функцию стрелки, вы можете привести нижеприведенный пример, где у меня есть класс с именем LoginClass, и внутри этого класса я написал стрелку с именем function , названную
successAuth
class LoginClass {источник
ЭТО ЭС6
Да, я думаю, что вы ищете что-то вроде этого:
источник
Вы можете пропустить функциональную часть и стрелку, чтобы создать функции. Пример:
источник