блок кода в фигурных скобках после вызова функции - PullRequest
0 голосов
/ 29 октября 2018

Я просматриваю этот код (урезанная версия реализации createStore в исходном коде Redux)

function createStore(reducer) {
    var state;
    var listeners = []

    function getState() {
        return state
    }

    function subscribe(listener) {
        listeners.push(listener)

        return unsubscribe() {
            var index = listeners.indexOf(listener)
            listeners.splice(index, 1)
        }
    }

    function dispatch(action) {
        state = reducer(state, action)
        listeners.forEach(listener => listener())
    }

    dispatch({})

    return { dispatch, subscribe, getState }
}

Мой вопрос относится к приведенному ниже блоку внутри

function subscribe(listener)


return unsubscribe() {
   var index = listeners.indexOf(listener)
   listeners.splice(index, 1)
}

Сечение в фигурной скобке

{
   var index = listeners.indexOf(listener)
   listeners.splice(index, 1)
}

этот блок передается методу unsubscribe ()? есть ли сходство с блоками Руби? как это работает в JavaScript?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Этот блок кода является частью функции unsubscribe, возвращаемой методом подписки

0 голосов
/ 29 октября 2018

Прежде всего, есть некоторые проблемы с кодом, который вы разместили. Лучшая урезанная версия функции createStore() будет иметь вид:

function createStore(reducer) {
  var listeners = [];

  function subscribe(listener) {
    listeners.push(listener);

    return function unsubscribe() {
      var index = listeners.indexOf(listener)
      listeners.splice(index, 1)
    };
  }

  return {subscribe};
}

Обратите внимание, что вы забыли некоторые точки с запятой и что ( EDIT: OP ничего не забыл. Redux пропускает точки с запятой для соответствия React Router ESLint ) * Метод 1013 * не возвращал function unsubscribe(), а просто unsubscribe().

Теперь, отвечая на вопрос, эта статья - хорошая лекция, иллюстрирующая различия между Ruby и JavaScript по этой теме.

Методы Ruby не являются функциями или первоклассными гражданами, поскольку их нельзя передавать другим методам в качестве аргументов, возвращать другими методами или назначать переменным. Ruby Procs являются первоклассными, похожими на первоклассные функции JavaScript.

В JavaScript функции действительно первоклассные граждане. Их можно пропустить как любой другой фрагмент данных.

В нашем примере функция createStore() возвращает объект, содержащий функцию / метод subscribe(). Это происходит путем возврата имени функции (subscribe). Аналогично, subscribe() также возвращает функцию, но на этот раз объявление этой функции происходит непосредственно внутри оператора return. Оба являются допустимыми способами передачи функции.

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

var myObject = createStore("foo");

Новый объект имеет метод subscribe(). Если вы вызовете этот метод, вы получите функцию unsubscribe().

var myFunction = myObject.subscribe("bar");

Конечно, вы можете сделать это в одну строку:

var myFunction = createStore("foo").subscribe("bar");

Попробуйте в приведенном ниже фрагменте:

function createStore(reducer) {
  var listeners = [];

  function subscribe(listener) {
    listeners.push(listener);

    return function unsubscribe() {
      var index = listeners.indexOf(listener)
      listeners.splice(index, 1)
    };
  }

  return {subscribe};
}

var myObject = createStore("foo");
console.log(myObject);  // print an object with the subscribe method.
var myFunction = myObject.subscribe("bar");
console.log(myFunction);  // print the unsubscribe function

console.log(createStore("foo").subscribe("bar"));

Вы также можете прочитать об объектах в MDN .

0 голосов
/ 29 октября 2018

Когда вы вызываете subscribe и передаете его слушателю, он возвращает вам функцию, которую вы можете вызвать в любое время позже. Пример:

const {dispatch, subscribe, getState} = createStore(this.myReducer); 
// for demonstration purpose. Now you have references to the values createStore() returns;

const subscription = this.subscribe(this.listener)

Теперь всякий раз, когда вы звоните this.subscription(), он выполняет это:

var index = listeners.indexOf(listener)
listeners.splice(index, 1)

с listener сохраняются в закрытии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...