3
respostas

function como parâmetro

        this._listaNegociacoes = new ListaNegociacoes(function(model){
            console.log(this);
            this._negociacoesView.update(model);
        });

Não entendi essa parte.

Fui tentar simular de outra forma, e deu erro.

//Objeto com uma função ( this._negociacoesView.update(model) ), seria a minha matematica.soma(a,b)

var matematica = {

    soma: function(a,b){ return a + b; }
};

// Recebendo uma função em uma variável (seria o nosso "parâmetro" ), passei como "parâmetro esses dados function(a,b){ matematica.soma(a,b); } e depois executo minha variável como function

var calculo = function(a,b){ matematica.soma(a,b); }

//executando..

calculo(2,2);
//resultado
undefined

Metodo válido:

var calculo = matematica.soma;
calculo(2,2);
//resultado
4

Fiz, todo esse processo pra tentar entender, porem não cheguei em nenhuma conclusão.

Pq que uma function consegue executar outra function dentro de um parâmetro? e pq não consigo fazer o mesmo "simulando" um objeto?

3 respostas

Bom dia Nícolas,

no seu exemplo, quando você utiliza var calculo = function(a,b){ matematica.soma(a,b); } a sua variável calculo está definindo uma nova função.

Apesar da função matematica.soma retornar um valor, esse valor permanece dentro do escopo da nova função definida, por isso você não vê nenhum valor de retorno (a não ser que você utilize return).

Já em var calculo = matematica.soma; você está simplesmente apontando diretamente para a função, por isso que neste caso calculo(2,2) apresenta um resultado (sem novo escopo definido).

Ok, um dos problemas foi resolvido, mas ainda não entendi :s

Pq aqui funciona passar 2 funções sem utilizar return?

this._listaNegociacoes = new ListaNegociacoes(function(model){
            console.log(this);
            this._negociacoesView.update(model);
        });

Só pra efeito de comparação:

var calculo = function(a,b){ matematica.soma(a,b); }

Ambos os códigos recebem os mesmos valores.

this._armadilha = ƒ (model){
            this._negociacoesView.update(model)
        }

calculo = ƒ (a,b){ 
    matematica.soma(a,b); 
}

Boa noite Nícolas,

o trecho de código

this._listaNegociacoes = new ListaNegociacoes(function(model) {
            console.log(this);
            this._negociacoesView.update(model);
        });

e a linha em seu respectivo construtor

this._armadilha = armadilha

equivale a

var calculo = matematica.soma;

Que por sua vez é diferente de

var calculo = function(a,b){ matematica.soma(a,b); }

Neste último exemplo, você está definindo um novo método onde, dentro dele, você realiza uma chamada a outro método definido anteriormente. O retorno deste método definido anteriormente vai parar no escopo deste novo método. Como não há nenhuma variável lá recebendo esse valor, e não há nenhum retorno, nada é impresso no console JavaScript. O resultado undefined que você obteve não significa erro, mas sim ausência de valor. O método em si foi executado (verifique inserindo um console.log('Executado!') antes do método acabar).

Por fim, somente para esclarecer, quando você passa a definição de uma função como parâmetro (isto é, function(...) { /* código aqui */ }) é como se na verdade a seguinte execução ocorresse (no construtor da classe ListaNegociacoes, usando o exemplo da aula em questão):

/* 
  * Fase de Atribuição de 
  * argumentos aos parâmetros
  */
let armadilha = function(model) {
            console.log(this);
            this._negociacoesView.update(model);
        }
/*
 * Execução do método
 */
this._negociacoes = [];
this._armadilha = armadilha;

Espero ter ajudado.