Прежде всего, есть некоторые проблемы с кодом, который вы разместили. Лучшая урезанная версия функции 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 .