2013-04-17 9 views
0

Disons que j'ai ceci:Déclarer var dans une expression unray?

$(obj).attr("style","...top:"+________)

Supposons maintenant que le top est calculé:

(o.outerHeight(true)>=30?o.outerHeight(true)+'px':'-5px')

Mon problème est le répéter o.outerHeight(true)

pour simplicty: Je kn ow je peux faire en général:

((a=5)>2?a:-1) //5 - Notez que le calcul de a n'est pas répété.

mais cela crée une variable globale a. (Et je ne veux faire)

window.a //5

J'ai essayé:

((var a=5)>2?a:-1) * // erreur: jeton inattendu var

Est-il possible (sauf déclaration mon propre var) pour éviter cette répétition?

+0

Pourquoi essayez-vous de serrer que dans une seule ligne/déclaration du tout? – ThiefMaster

+0

Pouvez-vous essayer de calculer outerHeight avant attr(): 'var n = o.outerHeight (true); (n> = 30)? n + 'px': '-5px'' – Victor

+0

@ThiefMaster Pour apprendre plus profondément JS. Tout ne doit pas avoir une raison particulière. –

Répondre

5

Vous pouvez utiliser un iife:

(function(value) { return complex_expression_using_value; }(some_expression)) 

De cette façon, vous créez un paramètre de fonction officielle plutôt qu'un var. Pas de pollution de l'espace de noms.

Pour l'appliquer à votre exemple précis:

var top = (function(value) { 
     return (value >= 30 ? value : -5) + 'px'; 
    }(o.outerHeight(true))); 

Vous pouvez également utiliser la Ia vie dans le cadre d'une autre expression:

$(obj).attr("style","...top:"+ 
    (function(value) { 
      return (value >= 30 ? value : -5) + 'px'; 
     }(o.outerHeight(true))) 
) 
+1

+1 pour offrir une solution au lieu de simplement expliquer le problème comme je l'ai fait! –

+1

+1 J'aime vraiment ce – bruchowski

+0

le 'var top' à votre deuxième exemple est exactement ce que je voulais éviter. –

2

Non, car var a est une déclaration, et l'opérateur conditionnel (ternaire) ne peut prendre des expressions comme opérandes, selon le language grammar:

ConditionalExpression:
        LogicalORExpression
        LogicalORExpression?AssignmentExpression:AssignmentExpression

vous devez déclarer la variable au préalable.

Questions connexes