JavaScript каррирование: вернуть функцию, определенную вне текущей функции - PullRequest
0 голосов
/ 03 августа 2020

Я изучаю функции каррирования в JS и застрял с этой проблемой.

Моя цель - упорядочить массив объектов по непроизвольному свойству.

let people = [
    { name: 'Bob', age: 27 },
    { name: 'Al',  age: 47 }
];

var compare = function(a, b) {
    if (a[property] < b[property]) return -1;
    if (a[property] > b[property]) return 1;
    return 0;
};

function sortBy(property) {
    /* // this works
    return function compare(a, b) {
        if (a[property] < b[property]) return -1;
        if (a[property] > b[property]) return 1;
        return 0;
    };
    */

    // this doesn't work
    return compare;
}

people.sort(sortBy('name'));
console.log(people);

С этим кодом я получаю эту ошибку:

if (a[property] < b[property]) return -1;
          ^
ReferenceError: property is not defined

Почему, если я определяю функцию compare внутри функции sortBy, я не получаю никакой ошибки, а вместо этого, если я определяю compare внешняя функция Я получаю сообщение об ошибке?

Функция compare не должна заключаться в закрытие?

1 Ответ

0 голосов
/ 03 августа 2020

Лучшее, что я могу найти, - это использовать .bind, но он не идеален, поскольку заставляет вас добавлять this в compare, что означает, что вы не можете использовать его, не привязав его

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

let people = [
    { name: 'Bob', age: 27 },
    { name: 'Al',  age: 47 }
];

var compare = function(a, b) {
    if (a[this.property] < b[this.property]) return -1;
    if (a[this.property] > b[this.property]) return 1;
    return 0;
};

function sortBy(property) {
    return compare.bind({property});
}

people.sort(sortBy('name'));
console.log(people);
...