var e = setTimeout(function() {
var e = $(window).scrollTop(),
n = $(".header-nav-wrap"),
i = $(".header-nav-wrap-inner"),
s = $(".sub-nav");
e > 200 ? n.hasClass("hn-fixed") || (n.addClass("hn-fixed"),
s.hide(),
a || i.css("top", "-80px").animate({
top: "0px"
}, 500)) : n.hasClass("hn-fixed") && (n.removeClass("hn-fixed"),
s.show())
}, 30);
帮忙解释一下从 e > 200 ? ....... s.show()这段代码???
拉直:
强烈补充一下:一是逻辑运算符优先级比三元运算符高,二是三元运算符是从右向左运算的。
因此刚才的答案有些细节是错的。
相关链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
为了更便于分析,给代码加上括号或适当换行或许是个好方法。
1 问号和冒号
拆分看一下,最外层其实是个三元运算符
即 e大于200 ,执行代码段1;否则执行代码段2。
相关资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
2 或
来看代码段1
最外层其实是
简单来讲,就是n有class 'hn-fixed'吗?没有就执行代码段1A,有就跳过。
解释下:二元逻辑运算符
逻辑表达式的运算的顺序是从左到右,如果最左边的表达式会决定最终结果,那么右边就不执行了。
举例:
相关资料https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR
逗号
来看代码段1A
中间那个逻辑或就不管了,这里其实就看
注意,这个代码段1Ac不是
a
,而是a || i.css('top', '-80px').animate({top: '0px'}, 500)
,由于逻辑或的优先级高,a和后面的animate动作被结合起来了逗号操作符:逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值。
这里其实就是顺序执行了三个代码段,并且把
a || i.css('top', '-80px').animate({top: '0px'}, 500)
的结果作为返回值传递给上层。相关文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators#逗号操作符
补充:关于三元运算符的顺序
运算符的顺序在不同语言,顺序都不一样。另外这个顺序是多个平级运算时才存在的。
比如加法:
(A)+(B)+(C)
是先执行的A+B(假设和为sum1),后执行的sum1+C。
对于三元运算符,是这样的:
是最先执行的后边的
(a == 1) ? (c = 'c') : (d = 'd');
,因为a不等于1,所以d='d'之后计算
(a == 1) ? (b = 'b') : 'd'
,所以rst会被赋值d。