2010-05-28 8 views
1

Je travaille sur un plugin jQuery, mais j'ai du mal à faire correctement mes variables. Voici un exemple de mon code:Comment évaluer correctement les variables dans jQuery?

(function($) { 

$.fn.ksana = function(userOptions) { 
    var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions); 

    return this.each(function() { 
     alert(rotate()); // o is not defined 
    }); 
}; 

function rotate() { 
    return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot))); 
}; 

$.fn.ksana.defaultOptions = { 
    negRot: -20, 
    posRot: 20 
}; 

})(jQuery); 

J'essaie d'obtenir la rotation de la fonction privée pour être en mesure de voir la variable o, mais il ne cesse 'o est alertes à pas défini. Je ne suis pas sûr de ce que je fais mal.

Répondre

6

La variable o est SCOPED localement dans la fonction $.fn.ksana, afin de permettre l'rotate de l'atteindre, vous devez soit:

  • Il suffit de passer la variable à o comme un argument.
  • Définissez cette fonction au sein de ksana.
  • Définissez o dans l'étendue externe.

OMI, en passant comme argument est assez propre:

(function($) { 
    $.fn.ksana = function(userOptions) { 
    var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions); 

    return this.each(function() { 
     alert(rotate(o)); // pass o 
    }); 
    }; 

    function rotate(o) { // use passed object 
    return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot))); 
    } 
//... 
})(jQuery); 
+0

+1 Puisque vous n'êtes pas exposer 'tourner 'En dehors du plugin, on peut aussi passer la variable en argument pour éviter d'avoir un état global inutile. – R0MANARMY

+0

Cela peut être une question stupide, mais cela ne crée-t-il pas un surcoût supplémentaire? Je vais avoir beaucoup de fonctions qui auront besoin d'accéder à o, donc je passerais beaucoup autour de moi ... – safetycopy

+0

@safetycopy: Eh bien, vous pouvez exposer 'o' à plus de fonctions, comme je le dis dans ma troisième approche, définissant 'o' dans la portée englobante. – CMS

2

Vous devez mettre o dans le champ qui l'entoure pour les rotate et ksana - dire dans votre champ racine function($). Comme ceci:

(function($) { 

var o; 

$.fn.ksana = function(userOptions) { 
    o = $.extend({}, $.fn.ksana.defaultOptions, userOptions); 

Mais pourquoi ne pas faire juste un argument de rotate? Pourquoi avez-vous besoin de le rendre "global"?

+0

o est fusionné à partir des options utilisateur et par défaut. Si c'est dans la portée de la fonction racine, je ne pense pas que je serais capable d'y parvenir. – safetycopy

2

Vous pouvez mettre la rotate-fonction dans la même portée que o:

(function($) { 

$.fn.ksana = function(userOptions) { 
    var o = $.extend({}, $.fn.ksana.defaultOptions, userOptions); 

    function rotate() { 
     return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot))); 
    }; 

    return this.each(function() { 
     alert(rotate()); 
    }); 
}; 

Ou, il suffit de passer à tourner:

(function($) { 

    var o; 
    $.fn.ksana = function(userOptions) { 
     o = $.extend({}, $.fn.ksana.defaultOptions, userOptions); 

     return this.each(function() { 
      alert(rotate(o)); 
     }); 
    }; 

function rotate(o) { 
    return Math.round(o.negRot + (Math.random() * (o.posRot - o.negRot))); 
}; 
+0

Déplacerait-il la fonction de rotation dans la même portée que o garder la rotation privée? – safetycopy

Questions connexes