2016-09-06 2 views
0

j'ai écrit une fonction simple qui se réduit à néant après son premier appel:Pourquoi cette expression javascript est-elle évaluée à false?

var nullify = function(){ 
    nullify = null; 
    return 1;  
}; 

Si je l'appelle deux fois, comme celui-ci:

console.log(nullify()); 
console.log(nullify); 

Puis la 1ère expression retournera 1, et l'autre évaluera à null. Tout est clair jusqu'à ce point.

Si je le fais cependant dans une seule expression et l'envelopper dans une fonction:

var fun = function(f){ 
    return f() && !f; 
} 

Puis, pour une raison quelconque:

console.log(fun(nullify)); 

évalue à false, alors que je me attends à être true, puisque le 1er opérande retournera 1 et l'autre, comme une négation de null, true.

L'évaluation de l'opérande de droite se produit lorsque la fonction nullify a déjà été appelée nullify = null, n'est-ce pas? Qu'est-ce que je rate?

+4

Testé moi-même, je reçois 'true'. –

+0

D'accord, j'ai fait une erreur, une seconde je édite –

+1

Les affectations sont faites par valeur, pas par référence. – Oriol

Répondre

4

Qu'est-ce qui me manque?

que votre fonction fun teste la variable f, qui est encore lié à la fonction que vous avez passé dans, pas la variable nullify (qui a la valeur null en effet).

+0

Par conséquent, la fonction nullify est annulée, mais pas f? –

+0

Oui. 'f' n'est pas une référence à la variable' nullify', c'est une variable séparée contenant une référence à la fonction. – Bergi

+0

@ MichałSzydłowski Oui. 'f' est juste une copie. JS passe par valeur, pas de référence. – Oriol