2015-01-20 3 views
4

Мне было интересно, можно ли передать именованную функцию в Array.sort(). Я пытаюсь сделать что-то вроде логики ниже, но, очевидно, он жалуется на то, что a не определяется.JavaScript с именем функции сортировки

if (iWantToSortAscending) { 
    myArray.sort(sortAscending(a, b)); 
} else { 
    myArray.sort(sortDescending(a, b)); 
} 

// my lovely sort functions 
function sortAscending(a, b) { 
    ... 
    sorty worty 
    ... 
} 

function sortDescending(a, b) { 
    ... 
    sorty worty differently 
    ... 
} 

Очевидно, что я мог бы получить код для работы, как показано ниже, и это делает, но я скорее не буду использовать анонимные функции для удобства чтения и отладки.

if (iWantToSortAscending) { 
    myArray.sort(function (a, b) { 
     ... 
     sorty worty 
     .... 
    } 
} else { 
    ... 

ответ

5

Это точно, но вы должны ссылаться на функцию, а не называть его, и аргументы передаются автомагически

myArray.sort(sortAscending); 

всякий раз, когда вы добавляете скобки и аргументы функции, он немедленно позвонил.
Если вы хотите, чтобы он был вызван другой функцией, например, как обратный вызов в sort(), вы ссылаетесь на нее и оставляете круглые скобки.

+0

Отлично! Большое спасибо за это. –

4

Подумайте, «что делает моя программа?»

myArray.sort(sortAscending(a, b)); 

Что делать? Он пытается вызвать myArray.sort с результатом выражения sortAscending(a,b). Прежде всего, a и b не определены, поэтому он выбрасывает (ReferenceError). А что если a и b определены? Результат выражения sortAscending(a,b) не будет функцией.

Чтобы получить работу, вы должны использовать код myArray.sort(sortAscending); - он передает функцию в качестве аргумента.

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