Qual é a diferença entre chamar uma função e passar uma função?

Chamar uma função é quando você realmente a executa.

Passar uma função é quando a função A precisa da função B para funcionar. Portanto, quando você chama a função A, passa a função B como argumento. Nesse caso, você não está chamando a função B, mas está fornecendo a função A para que a função A possa chamá-la.

Um exemplo desse padrão são as funções de classificação.

Você não pode simplesmente ter uma função chamada sort, que aceita uma matriz como argumento, porque isso funcionaria apenas para matrizes muito simples, como matrizes de números ou seqüências de caracteres.

E se você tiver uma matriz de objetos do tipo pessoa e esses objetos tiverem uma propriedade, primeiro nome, pela qual você deseja classificar.

Para que a função de classificação funcione com este exemplo, você precisará fornecer uma maneira de acessar a propriedade pela qual deseja classificar.

A maneira mais fácil de fazer isso é passando uma função.

função getName (pessoa do objeto) {
 return person.firstName
}

Matriz  pessoas = getPeopleArray ()

Matriz  sortedPeople = sort (pessoas, getName)

Nesse caso, a função que está sendo passada para classificação é getName.

Se isso ajudou, faça um voto positivo e siga-me para saber mais sobre programação.

Chamar uma função é quando você realmente a executa.

Passar uma função é quando a função A precisa da função B para funcionar. Portanto, quando você chama a função A, passa a função B como argumento. Nesse caso, você não está chamando a função B, mas está fornecendo a função A para que a função A possa chamá-la.

Um exemplo desse padrão são as funções de classificação.

Você não pode simplesmente ter uma função chamada sort, que aceita uma matriz como argumento, porque isso funcionaria apenas para matrizes muito simples, como matrizes de números ou seqüências de caracteres.

E se você tiver uma matriz de objetos do tipo pessoa e esses objetos tiverem uma propriedade, primeiro nome, pela qual você deseja classificar.

Para que a função de classificação funcione com este exemplo, você precisará fornecer uma maneira de acessar a propriedade pela qual deseja classificar.

A maneira mais fácil de fazer isso é passando uma função.

função getName (pessoa do objeto) {
 return person.firstName
}

Matriz  pessoas = getPeopleArray ()

Matriz  sortedPeople = sort (pessoas, getName)

Nesse caso, a função que está sendo passada para classificação é getName.

Se isso ajudou, faça um voto positivo e siga-me para saber mais sobre programação.

Chamar uma função é invocá-la. Você gasta ciclos de CPU e aloca memória, etc. No final, você obtém a saída.

Passar uma função é simplesmente fazer referência a ela programaticamente sem realmente invocá-la. Em outras palavras: passar a função "a" é invocar outra função "b" com um argumento da função "a". Cabe à função "b" se a função "a" é ou não realmente chamada. Portanto, a função "a" não pode ser invocada; seu resultado pode não ser calculado; pode não usar ciclos da CPU e alocar memória.

Em uma linguagem de programação funcional, funções são 'objetos de primeira classe'. Elas podem ser usadas como outros objetos, por exemplo, passadas como parâmetros para outras funções. O exemplo canônico é a função de mapa, aqui em Clojure:

(defn times2 [x] (* x 2))

(mapa times2 [2 3 4])

-> [4 6 8]

então aqui definimos uma função times2 e depois a passamos para o mapa de funções de ordem superior. O mapa assume a função de um argumento como argumento e o aplica a cada elemento de uma lista e retorna a lista resultante.

Vamos ver se posso dar uma resposta útil, porque a pergunta revela que estamos começando de um nível muito básico. Chamar uma função é a coisa mais básica que existe. Passar uma função é uma ideia muito mais sofisticada.

Chamar funções é o objetivo de um programa. Um programa é executado executando (chamando) funções que foram definidas pelo programador ou nas bibliotecas de funções que o programa está usando. Toda “ação” que um programa executa envolve a execução (chamada) de uma função definida, que pode envolver a chamada de outras funções.

As funções podem não precisar de nenhum dado de entrada. Eles podem ser chamados sem os chamados "argumentos". Mas a maioria das funções exige algum tipo de dado de entrada como argumento. Por exemplo, uma função que adiciona dois números precisa que os dois números sejam adicionados para serem inseridos como dois argumentos. (“Pegue esses dois números como entrada e adicione-os e me devolva a soma.”)

Agora chegamos à parte mais interessante. Às vezes, uma função precisa ser customizada por outra função cuja definição é inserida na primeira função como argumento. Por exemplo, muitas funções operam aplicando algum tipo de teste aos dados, por exemplo, para filtrá-los. A função exata do testador pode ser personalizada para cada chamada de função de filtro. Portanto, você pode usar a mesma função de filtro genérica, mas cada vez que a chama, passa a uma definição de função como argumento para personalizar o processo de filtragem. (“Pegue esta função de testador e use-a para filtrar esses dados na função de filtro.”) A função de testador que você passa para a função de filtro pode testar apenas números pares, somente letras maiúsculas ou qualquer outra coisa. Mas você passou uma função (definição) para uma função para que a última função possa usar a função anterior para realizar seu trabalho de maneira personalizada.

Isso nos leva à razão prática mais importante para passar funções na entrada (argumentos) para outras funções. Todos os tipos de funções são chamadas de "assíncronas". Sem elaborar esse conceito desafiador, muitas vezes significa que uma função terá que esperar que algo fora de seu controle aconteça antes de terminar. O exemplo clássico é uma função que solicita dados de um servidor (como dados de uma página da web). A função envia uma solicitação ao servidor, mas não pode saber exatamente quando uma resposta chegará. Então, ele fica "em espera". Esse chamado "bloqueio" geralmente não é uma coisa boa, porque impede o processador de fazer outras coisas. Portanto, a melhor idéia é deixar a função abrir mão do controle do processador até que a resposta chegue. Quando esse "evento" ocorre, a função transferiu os dados provenientes do servidor para outra função, chamada de "função de retorno de chamada". Para fazer isso funcionar, quando chamamos a função original que faz a solicitação do servidor, temos que transmita a definição da função de retorno de chamada que queremos executar (chamada) quando os dados retornarem do servidor. Esse é, de longe, (junto com casos análogos) o contexto mais importante é o de que passamos uma função para outra função - para fornecer a função de retorno de chamada que será executada quando qualquer atividade "assíncrona" atrasada for resolvida.

Chamar uma função é realmente invocá-la para fazer seu trabalho. Enquanto a passagem de uma função normalmente significa tratar uma função (ponteiro) como um parâmetro para outra função para que ela faça seu trabalho.

A função qsort (classificação rápida) da biblioteca padrão C usa uma função de comparação como parâmetro para permitir que o qsort descubra se dois elementos são iguais, menores ou maiores que o outro.

void qsort (void * base, size_t nitems, size_t size, int (* compar) (const void *, const void *))

qsort (array, N, sizeof (array [0]), & mycomp);

Na função acima, invocação - qsort () está sendo chamada enquanto mycmp () está sendo passado.