2017-08-12 4 views
5

Je regardais à travers la source React et trébuché à travers une exigence avec var emptyFunction = require('fbjs/lib/emptyFunction');.À quoi sert makeEmptyFunction dans fbjs?

J'ai regardé cette fonction et j'ai été troublée par ce qu'elle fait.

est ici la fonction

function makeEmptyFunction<T>(arg: T): (...args: Array<any>) => T { 
    return function() { 
    return arg; 
    }; 
} 

const emptyFunction: (...args: Array<any>) => void = function() {}; 

Dans les commentaires, ils donnent l'explication suivante que je suis confus par:

Cette fonction accepte et défausse entrées; Cela n'a pas d'effets secondaires. Ceci est principalement utile idiomatiques pour la fonction Overridable paramètres qui ont toujours besoin d'être appelable, puisque JS manque un idiome nul appel ala Cocoa

Je ne l'ai jamais rencontré idiome d'appel nul et était quelqu'un en espérant pouvoir clarifier ce que cela signifie et expliquer le but de cette fonction dans un langage moins technique.

Espérons que cette question ne sera pas méprisée car elle n'est pas exactement liée au code. Peut-être qu'il appartient à un autre endroit, si c'est le cas, je suis désolé.

Répondre

4

Lors de la programmation en JavaScript, nous pouvons prendre une fonction en tant que paramètre pour une opération donnée. Par exemple, une fonction peut avoir un rappel qui est invoqué après une sorte d'événement.

function doIt(callback) { 
    // some work 
    callback(); 
    // more work 
} 

Maintenant, si ce callback est un paramètre optionnel et il ne fournit, nous obtenons Uncaught TypeError: callback is not a function erreur car le rappel est défini. Il y a deux solutions à ce problème. La plus évidente consiste à vérifier le callback avec une instruction if. Une autre option consiste à définir une fonction vide comme valeur par défaut callback si elle n'est pas affectée. Cette approche est très utile et brille si nous avons plusieurs endroits qui invoquent la fonction callback. Nous n'avons donc pas besoin de le vérifier à chaque fois avant de l'appeler.

function doIt(callback) { 
    callback = callback || function(){}; 
    // some work 
    callback(); 
    // more work 
} 

De même, il existe de nombreux cas d'utilisation où nous pouvons avoir des variables de fonctions remplaçables. C'est un modèle commun pour définir ce type de variables comme fonction par défaut pour que nous puissions les appeler sans se soucier de savoir si celles-ci sont affectées ou non.

De même, dans certains cas particuliers, il est utile d'avoir des fonctions qui ne font que renvoyer une valeur particulière. makeEmptyFunction est utilisé pour créer de telles fonctions. Fondamentalement, il retourne une fonction qui ne fait rien mais retourne ce que le paramètre lui passe.

emptyFunction.thatReturnsFalse = makeEmptyFunction(false); 

Comme vous pouvez le voir dans le fichier, le code ci-dessus générer une fonction vide qui renvoie la valeur false. "Null call idiom" est quelque chose que nous trouvons dans la programmation Objective-C/Cocoa. Il vous permet essentiellement de call a method of an uninitialized object (pointeur nul) sans donner d'erreurs comme dans la plupart des autres langues. Je pense que c'est ce que l'auteur a essayé d'expliquer dans le commentaire.

Depuis JavaScript n'a pas cette fonctionnalité de la langue, nous l'obtenons explicitement en utilisant des fonctions vides. Certaines personnes l'appellent no-op ou noop et vous pouvez trouver des aides similaires dans d'autres bibliothèques JavaScript populaires telles que JQuery et AngularJS également.