2013-06-11 3 views
0

Excusez-moi pour une question non-standart, tout fonctionne très bien, mais il est toujours étrange
Sur une page Web J'utilise un datepicker de here
Voici le code partiel:
HTML:JavaScript objet comportement étrange

<div id="datepicker-calendar"></div> 

Fonction pour l'insertion DatePicker:

function insert_datepicker(mode) 
{ 
    $('#datepicker-calendar').empty(); 
    ... 
    $('#datepicker-calendar').DatePicker({ 
     ... 
     onChange : function(date,el) { 
      if (mode == 1){ 
       doSmth1(); 
      } 
      if (mode == 2){ 
       doSmth2(); 
      } 
     } 
    }); 
    ... 
} 

'mode' est pas une variable globale et est représentée comme 'indéfini' dans la console.
Lorsque j'appelle "insert_datepicker (2)" onChange fonctionne correctement, mais ne devrait-il pas y avoir une erreur lorsque l'événement est déclenché?
Comment la fonction "se souvient" de la note?

+0

Pourquoi devrait avoir une erreur? –

+0

C'est une fermeture de JavaScript. Voir http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

Répondre

1

C'est à cause de closure nature de javascript, cela permet à une fonction interne d'accéder aux variables déclarées dans la portée externe.

Dans votre cas, la variable mode est déclarée à l'intérieur insert_datepicker fonction et vous avez une fonction interne anonyme pour onChange, ici la fonction intérieure aura accès aux variables déclarées à l'intérieur insert_datepicker comme variables de fermeture.

0

mode est fourni lorsque vous appelez insert_datepicker(). mode dans votre cas, lors de l'appel insert_datepicker(2) est en réalité 2. Tous les cueilleurs de date attachés de cette façon auront leur mode lié au mode passé lors de l'appel insert_datepickers. Si vous ne transmettez pas mode, ce sera undefined. La comparaison à 1 et 2 donnera false et n'exécutera pas les blocs des instructions.

Questions connexes