2016-06-14 3 views
1

Я застрял на примере из книги JS. Вот стрелка. Хорошо работает, но какие переменные относится к функции? Как он знает, что делать с «a, b»?Функция стрелки. К каким переменным относится функция?

Я не понимаю, что происходит за кулисами ...

const arr = [{ 
 
    name: "Suzanne" 
 
}, { 
 
    name: "Jim" 
 
}, { 
 
    name: "Trevor" 
 
}, { 
 
    name: "Amanda" 
 
}]; 
 

 
// arr sorted reverse alphabetically 
 
// by second letter of name property 
 

 
console.log(arr.sort((a, b) => a.name[1] < b.name[1]));

+4

Речь идет не о функциях стрелок. 'sort' - это функция более высокого порядка, она требует обратного вызова, который вызывается с двумя аргументами. 'a' и' b' можно назвать чем угодно. – elclanrs

+0

Имеет ли книга * действительно * 'arr.sort ((a, b) => a.name [1]

+0

Это правда? Я думал, что функции стрелок, которые опускают wrapping, '{}' 'автоматически возвращаются. Изменить: он работает (хотя я бы, вероятно, отсортировал по имени [0] ', а не' name [1] ' – pmilla1606

ответ

4

Значения a и b определяются функцией Array#sort, что и вызывает стрелу функция. Это то же самое, что и с обычными функциями; например, ваш код будет работать одинаково, как это:

console.log(arr.sort(function(a, b) { 
    return a.name[1] < b.name[1]; 
}); 

Внутри Array#sort, вы можете себе представить вызов обратного вызов:

function Array_sort(callback) { 
    // ... 

    while (not_done_sorting_yet) { 
     // ... 
     result = callback(element[x], element[y]); // The call to your callback 
     // ...code using result... 
    } 

    // ... 
} 

Так же, как с любым обратным вызовом (действительно, любая функция), это код , вызывающий, который определяет, какие аргументы он получает, и их значения. (Игнорирование частичного применения для простоты.)


BTW: Этот код является неправильным, возвращаемое значение из sort обратного вызова должно быть номером, а не логическим значения: 0 если a и b равны для сортировки, меньше нуля a «меньше» b для целей сортировки (должен быть до b) и больше нуля, если a «больше чем» b для сортировки (должно прибыть после b).

Вот правильный вариант (для массива «сортируются в алфавитном порядке по реверс второй букве имени свойства» [с комментарием в цитируемом коде]):

// Reverse alpha by second letter in name 
console.log(arr.sort((a, b) => b.name[1].localeCompare(a.name[1]))); 

... так String#localeCompare возвращает соответствующее значение поскольку строка, на которую вы назовете ее, «меньше» или «больше» той, с которой вы ее вызываете. (И name[1] является односимвольной строкой.)

Смежные вопросы