2011-08-31 1 views
1

je traversais un code laissés par certains développeurs et sont venus depuis longtemps révolue à travers ceci:Javascript Function.prototype.bind Je veux vous assurer que je comprends

Function.prototype.binding = function() 
{ 
    if(arguments.length < 2 && typeof arguments[0] == "undefined") return this; 
    var __method = this, args = jQuery.makeArray(arguments), object = args.shift(); 
    return function() 
    { return __method.apply(object, args.concat(jQuery.makeArray(arguments))); }; 
}; 

et il est référencé ailleurs dans deux ou trois endroits, cette datatables fonction de rappel est representitive:

"fnRowCallback": function (nRow, aData, iDisplayIndex) 
    { 
    nRow = this.options.fnRowCallback(nRow, aData, iDisplayIndex); 
    return nRow; 
    }.binding(this), 

Je pense que ce que cela accomplit est de mettre le ce contexte dans la fonction de l'objet passé dans le .binding; Est-ce exact? Et cette façon de faire est-elle considérée comme une bonne pratique?

Merci, Matthew

Répondre

1

Je pense que ce que cela accomplit est de définir le contexte this dans la fonction de l'objet dans le passé .binding

correcte. En outre, il accepte éventuellement des arguments supplémentaires, qui sont passés dans la fonction lors de l'appel. Donc, si vous avez fait obj.f.binding(obj, 1, 2, 3)(4, 5, 6), les arguments reçus par obj.f seraient 1, 2, 3, 4, 5, 6.

Cette méthode reproduit la méthode standard ECMAScript Fifth Edition Function#bind, mais est nommée différemment, vraisemblablement car elle n'est pas complètement compatible avec l'interface définie par cette méthode.

+0

OK cela a du sens. J'ai entendu parler de polyfills qui 'améliorent' le moteur javascript jusqu'à ECMASCript 5 (ou en partie de toute façon.) Serais-je mieux de refactoriser le code pour utiliser une bibliothèque plus établie comme ça plutôt que ce code (refactoring par suppression) ? –

+1

Je voudrais personnellement aller avec un 'Function # bind' conforme à l'ECMA (potentiellement-polyfilled) si possible ... pas sûr que ça vaut la peine de changer un vieux projet, cependant. FWIW Je pense qu'il est relativement peu probable que quelque chose soit s'appuyer sur la différence entre 'binding' et' bind' (principalement en utilisant la fonction bound en tant que constructeur). – bobince

1

ce que fait le code ajoute une méthode, binding au prototype de fonction. Puisque Function est un objet javascript (les fonctions sont des objets en javascript), cela ajoute fondamentalement une méthode au comportement par défaut de javascript.

Ceci est une pratique courante dans les frameworks js. Cette méthode particulière semble vous permettre de définir la portée de la méthode. Dans votre deuxième exemple, vous pouvez modifier binding(this) en binding(someObj) et lorsque la méthode s'exécutera, this dans la portée de la méthode sera someObj.

+0

Merci de votre réponse. Cette partie je comprends, mais est-ce que j'interprète l'intention de la méthode de liaison correctement? –

+0

@yes je crois que vous êtes – hvgotcodes

Questions connexes