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

Как написать функцию со стрелкой в ​​ES2015?

У меня есть функция, которую я пытаюсь преобразовать в новый синтаксис стрелки в 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?

4b9b3361

Ответ 1

Как написать функцию со стрелкой в ​​ES2015?

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

Per spec, эта функция имеет истинное имя, sayHello:

var sayHello = name => {
    console.log(name + ' says hello');
};

Это определено в Операторы присваивания > Семантика времени выполнения: Оценка, где он вызывает абстрактная операция SetFunctionName (вызов в данный момент находится на этапе 1.e.iii).

Аналогично, Runtime Semantics: PropertyDefinitionEvaluation вызывает SetFunctionName и, таким образом, дает этой функции истинное имя:

let o = {
    sayHello: name => {
        console.log(`${name} says hello`);
    }
};

Современные двигатели устанавливают внутреннее имя функции для таких утверждений; У края все еще есть бит, который делает его доступным как 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);
}

Ответ 2

Нет. Синтаксис стрелки - это короткая форма для анонимных функций. Анонимные функции, ну, анонимные.

Именованные функции определяются с помощью ключевого слова function.

Ответ 3

Если "named" означает, что вы хотите, чтобы свойство .name функции стрелки было установлено, вам повезло.

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

var sayHello = (name) => {
    console.log(name + ' says hello');
}

sayHello.name //=== 'sayHello'

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

Ответ 4

Похоже, что это возможно с ES7: https://babeljs.io/blog/2015/06/07/react-on-es6-plus#arrow-functions

Приведенный пример:

class PostInfo extends React.Component {
  handleOptionsButtonClick = (e) => {
    this.setState({showOptionsModal: true});
  }
}

Тело функций ES6 arrow имеет те же лексические значения, что и код, который их окружает, что дает нам желаемый результат из-за того, как объекты инициализаторов свойств ES7 охвачены.

Обратите внимание, что для того, чтобы это работало с babel, мне нужно было включить самый экспериментальный синтаксис этапа ES7 stage 0. В моем файле webpack.config.js я обновил загрузчик буфера таким образом:

{test: /\.js$/, exclude: /node_modules/, loader: 'babel?stage=0'},

Ответ 5

На самом деле, похоже, что один из способов именования функций стрелок (по крайней мере, в Chrome 77...) заключается в следующем:

"use strict";
let fn_names = {};
fn_names.foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
  foo();
} catch (e) {
  console.log(e.stack);
}

enter image description here

Ответ 6

чтобы написать названную функцию со стрелкой, вы можете найти пример ниже, где у меня есть класс с именем LoginClass, и внутри этого класса я написал стрелку с именем function, названной successAuth  class LoginClass {

    constructor() {

    }

    successAuth = (dataArgs)=> { //named arow function

    }

}

Ответ 7

Вы можете пропустить часть функции и часть стрелки для создания функций. Пример:

 class YourClassNameHere{

   constructor(age) {
     this.age = age;
   }

   foo() {
     return "This is a function with name Foo";
   }

   bar() {
     return "This is a function with name bar";
   }

 }

let myVar = new YourClassNameHere(50);
myVar.foo();

Ответ 8

ЭТО ЭС6

Да, я думаю, что ты за чем-то вроде этого:

const foo = (depth) => {console.log("hi i'm Adele")}
foo -> // the function itself
foo() -> // "hi i'm Adele"