2010-09-13 5 views
3

J'ai l'extrait de code suivant qui utilise 'eviter' Mes collègues développeurs soutiennent que la portée de 'var event' est limitée à la condition 'if'. Est-ce vrai? Comment puis-je faire un meilleur codeQuelle est la portée de cet objet?

function prepForDrag(obj, event) {  
    if(event= "undefined"){ 
     var event=obj || window.event; 
    } 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     // ... 
     enableDragState(obj); 
     disableClickEditHandler(obj); ## remove 'normal' line sched click handling in dd mode 
    } 
    } 
+3

Cet article sera intéressant: http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop/ – spender

Répondre

10

Ce n'est pas vrai. En JavaScript il y a pas de portée de bloc, seulement la portée de fonction*. Toutes les variables introduites dans une fonction sont hissées en haut de la fonction.

donc ce code:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     var event = obj || window.event; 
    } 
    // ... 
} 

est interprété un peu comme ceci:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     event = obj || window.event; 
    } 
    // ... 
} 

Comme Marcel Korpel « s ont souligné, en déclarant la variable event est inutile dans ce cas parce que event est déjà une variable locale puisque c'est un paramètre de fonction. Pour plus de détails, lire l'article de Ben Cherry au JavaScript Scoping and Hoisting.

Néanmoins, il existe deux problèmes supplémentaires dans votre code.

  1. Dans l'état vous avez utilisé l'opérateur d'affectation = au lieu de l'opérateur == de comparaison. Donc, la condition évalue toujours à vrai.

  2. Si vous souhaitez vérifier si un argument de fonction a été donné, utilisez l'instruction typeof event == 'undefined'.

Et j'ai bien peur qu'il y ait encore un problème ici. Quel est le but de la condition? Est-ce que l'argument obj a quelque chose à voir avec event? Les navigateurs modernes transmettent un objet événement à la fonction de gestionnaire d'événements en tant qu'argument mais some do not. Pour éviter le problème, le schéma suivant a tendance à utiliser:

function prepForDrag(e) { 
    var event = e || window.event; 
    // ... 
} 

* NB: il y a un let statement introduit en JavaScript 1.7 qui fournit la portée de bloc à l'intérieur des fonctions. Actuellement it's only supported in Firefox.

+0

Ceci n'est pas encore tout à fait correct: comme 'event' est déjà un paramètre à 'prepForDrag', il a déjà la portée locale et déclare la variable en utilisant' var' pas nécessaire. Votre dernier exemple de normalisation de l'interface Event est incorrect: l'interface Event est transmise en tant qu'argument * first * à un gestionnaire d'événements, donc dans ce cas, 'obj' contiendrait l'interface Event,' e' ne le fait jamais. –

+0

@Marcel Korpel: vous avez absolument raison. Merci de les signaler. –

2

JavaScript n'a pas la portée de bloc (sauf la variable d'exception dans un bloc catch), donc dans votre cas, cette variable event a une portée de fonction. Le mieux que vous pouvez faire, est de réattribuer event avec la nouvelle valeur, ou peut-être utiliser un autre nom de variable.

6

Comme event est déjà un paramètre à prepForDrag, sa portée est local à la fonction.

Mais votre état if est erroné:

if(event= "undefined") 

Cette attribue "undefined"-event et évalué à true.Vous devriez probablement utiliser

if (typeof event == "undefined") 

ou (comme je pense que ce que vous voulez est)

function prepForDrag(event) { 
    event = event || window.event; 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     ................................ 
     enableDragState(obj); 
     disableClickEditHandler(obj); // remove 'normal' line sched click handling in dd mode 
    } 
} 

BTW, pourquoi êtes-vous eval ing document.${formName}?

+0

@Korpel: Ceci est très vieux (5yrs) code.never touché/remodelé à moins de problèmes rencontrés. Celui-ci est un problème de compatibilité FF. Donc, l'évaluation est essentiellement la lecture des données de formulaire qui, bien sûr, javsripting pauvres :-( – GustyWind

Questions connexes