Путаница с многопараметрическими функциями с несколькими стрелками в JS

Путаница с многопараметрическими функциями с несколькими стрелками в JS

22.03.2020 04:43:44 Просмотров 21 Источник

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

С помощью следующей функции:

// ADD LEAD
export const addLead = (lead) => (dispatch, getState) => {
    axios
        .post('/api/leads/', lead, tokenConfig(getState))
        .then(........)
}

Зачем нам нужно несколько стрел? Почему lead находится в одном наборе скобок, а dispatch и getState-в другом наборе? Исходя из Python, этот синтаксис невероятно запутан и неинтуитивен.

Спасибо за любую помощь!

У вопроса есть решение - Посмотреть?

Ответы - Путаница с многопараметрическими функциями с несколькими стрелками в JS / Confusion about multi-parameter multi-arrow functions in JS

Является ответом!
T.J. Crowder

22.03.2020 04:48:02

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

export const addLead = (lead) => {
    return (dispatch, getState) => {
        axios
            .post('/api/leads/', lead, tokenConfig(getState))
            .then(........)
    };
}

Поэтому вы вызовете addLead, чтобы получить функцию с привязкой к ней lead:

const f = addLead("some lead");

...а затем назовите это с помощью dispatch и state соответственно:

f("dispatch", "state");

Боковое Примечание: немного странно (без дополнительного контекста), что функция addLead возвращает не результат вызова axios. Я бы и сам этого ожидал:

export const addLead = (lead) => {
    return (dispatch, getState) => {
        axios
            .post('/api/leads/', lead, tokenConfig(getState))
            .then(........)
    };
}
0

который:

export const addLead = (lead) => {
    return (dispatch, getState) => {
        axios
            .post('/api/leads/', lead, tokenConfig(getState))
            .then(........)
    };
}
1
MonteCristo

22.03.2020 04:50:04

Это функция закрытия. Это означает, что он принимает переменную и возвращает функцию, которая дает вам доступ к этой переменной.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

Ваш код по существу переводится следующим образом

export const addLead = function(lead) {
  return function(dispatch, getState) {
axios
  .post('/api/leads/', lead, tokenConfig(getState))
  .then()
  }
}

Закрыть X