假设我有这个:
$(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)以避免这种重复?
答案 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
您必须事先声明变量。