在unray表达式中声明var?

时间:2013-04-17 06:56:28

标签: javascript jquery

假设我有这个:

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

现在假设计算top

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

我的问题是重复o.outerHeight(true)

for simplicty :我知道我一般可以这样做:

((a=5)>2?a:-1) //5 - 注意a的计算不会重复。

但这会创建一个全局a变量。 (我想要这样做)

window.a //5

我试过了:

((var a=5)>2?a:-1) * //错误:意外的令牌变量

有没有办法(除了声明我自己的var)以避免这种重复?

2 个答案:

答案 0 :(得分:5)

您可以使用iife

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

这样,您可以创建一个正式的函数参数而不是var。没有命名空间污染。

将其应用于您的具体示例:

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

或者,您可以将iife用作另一个表达式的一部分:

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

答案 1 :(得分:2)

不,因为var a是一个语句,并且条件(三元)运算符只能将表达式作为其操作数,根据language grammar

  

ConditionalExpression
   LogicalORExpression
   LogicalORExpression ? AssignmentExpression : AssignmentExpression

您必须事先声明变量。