Как работает несколько функций стрелок в es6? [Дубликат]

Вы можете попробовать это

$i = 1
echo '<p class="paragraph'.$i.'"></p>';
++i; 
201
задан Bergi 13 January 2016 в 00:38
поделиться

3 ответа

Общий совет, если вас смущает какой-либо новый синтаксис JS и как он будет компилироваться, вы можете проверить babel . Например, копирование вашего кода в Babel и выбор предварительной настройки es2015 даст такой вывод, как

handleChange = function handleChange(field) {
 return function (e) {
 e.preventDefault();
  // Do something here
   };
 };

20
ответ дан Ben Smith 15 August 2018 в 17:21
поделиться

Подумайте об этом так, каждый раз, когда вы видите стрелку, вы заменяете ее на function. function parameters определены перед стрелкой. Итак, в вашем примере:

field => // function(field){}
e => { e.preventDefault(); } // function(e){e.preventDefault();}

, а затем вместе:

function (field) { 
    return function (e) { 
        e.preventDefault(); 
    };
}

Из документов :

// Basic syntax:
(param1, param2, paramN) => { statements }
(param1, param2, paramN) => expression
   // equivalent to:  => { return expression; }

// Parentheses are optional when there's only one argument:
singleParam => { statements }
singleParam => expression
24
ответ дан Julian 15 August 2018 в 17:21
поделиться

Понимание доступных синтаксисов функций стрелок даст вам представление о том, какое поведение они представляют, когда «прикован», как в приведенных вами примерах.

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

No arrow funcs              Implicitly return `e=>{…}`    Explicitly return `e=>{…}` 
---------------------------------------------------------------------------------
function (field) {         |  field => e => {            |  field => {
  return function (e) {    |                             |    return e => {
      e.preventDefault()   |    e.preventDefault()       |      e.preventDefault()
  }                        |                             |    }
}                          |  }                          |  }

Еще одно преимущество написания анонимных функций с использованием синтаксиса стрелок состоит в том, что они связаны лексически с областью, в которой они определены. Из «Функции стрелок» на MDN :

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

Это особенно уместно в вашем примере, учитывая, что оно берется из приложения . Как указано в @naomik, в React вы часто обращаетесь к функциям члена компонента , используя this. Например:

Unbound                     Explicitly bound            Implicitly bound 
------------------------------------------------------------------------------
function (field) {         |  function (field) {       |  field => e => {
  return function (e) {    |    return function (e) {  |    
      this.setState(...)   |      this.setState(...)   |    this.setState(...)
  }                        |    }.bind(this)           |    
}                          |  }.bind(this)             |  }
40
ответ дан user633183 15 August 2018 в 17:21
поделиться
  • 1
    Нет «тонкой функции стрелки». Почему бы не придерживаться официальной терминологии и назвать ее «функцией стрелок»? – Felix Kling 25 September 2015 в 15:06
  • 2
    Вы должны упомянуть что-то о функциях стрелок, лексических this – user633183 25 September 2015 в 17:42
  • 3
    @sdgluck, но это чрезвычайно важно в случае использования jhamm. Если он просто использовал ваш первый бит кода, он не будет работать должным образом, потому что функции не-стрелки (function(){...})) не лексически связывают this. Я понимаю, что он / она не расширил код в Do something here, но зная, что это часть компонента React, внутренняя функция, вероятно, вызовет другой код внутри компонента. – user633183 25 September 2015 в 17:49
  • 4
    Возможно, что-то вроде handleChange = field => e => { e.preventDefault(); this.setState(...); }; - this.setState определено в его коде, но не определено в вашем. – user633183 25 September 2015 в 17:53
  • 5
    @naomik Я соглашаюсь - вы правы, что если бы OP использовал общий код React в первом примере, в моем ответе они столкнулись бы с проблемами. Я исправлю свой пост, чтобы сказать об этом. Благодаря! – sdgluck 26 September 2015 в 08:44
Другие вопросы по тегам:

Похожие вопросы: