从jQuery.scrollTo.js
库中查看此块(在v1.4第184行)。
function animate( callback ){
$elem.animate( attr, duration, settings.easing, callback && function(){
callback.call(this, target, settings);
});
};
想知道比较如何与
一起使用callback && function() {callback.call(...)};
这背后的意义究竟是什么。提前谢谢。
答案 0 :(得分:6)
callback && function() {callback.call(...)};
正在做两件事:
callback
和JavaScript有一个名为"短路逻辑表达式" 的功能。如果逻辑表达式的一部分无法更改整体结果,则不会对其进行评估。
如果callback
是undefined
,那么它在逻辑表达式的上下文中评估为false(它是" falsy" ) 。所以表达式相当于false && ...
,在这种情况下,...
实际上不再重要,结果总是假的†1 。在这种情况下,JavaScript不会查看...
。
如果callback
不是 undefined
(但是函数),则逻辑表达式的第一部分的计算结果为true(它的&# 34; truthy" )。此时,JavaScript会评估...
。总体结果恰好是函数表达式。函数表达式产生一个匿名函数,然后传递给jQuery的animate()
。
callback.call()
执行callback
和确定this
中callback
的含义。因此callback.call(this)
确保this
引用与外部函数中相同的对象。
†1 绝对正确:表达式的整体结果不是false
,而是undefined
。
答案 1 :(得分:2)
callback && function() {callback.call(...)};
这将检查回调是否真实(不是假,0,“”,null,未定义,NaN),如果它是真实的,将评估语句的第二部分将返回将传入的函数作为一个论点。
示例:
var test = true && function() {};
console.log(typeof test); // "function"
答案 2 :(得分:1)
当与布尔操作数一起使用时,&&运算符执行布尔值 对两个值进行AND操作:当且仅当两者都返回TRue时返回TRue 它的第一个操作数和第二个操作数是真的。如果一个或两个 这些操作数是假的,它返回false。
此运算符的实际行为稍微复杂一些。它 首先评估它的第一个操作数,即左边的表达式。如果 此表达式的值可以转换为false(例如, 如果左操作数的计算结果为null,0,“”或未定义,则 operator返回左侧表达式的值。否则,它 计算其第二个操作数,右边的表达式,然后返回 该表达式的价值。
因此,此表达式callback && function(){ callback.call(this, target, settings); }
返回第二个匿名函数。这种语法的好处是可以在插件实例的上下文中调用callback
函数。
答案 3 :(得分:1)
expr1 && expr2
逻辑AND(&&
)运算符如果可以转换为false则返回expr1
;否则,返回expr2
。
现在在您的示例中,callback
中的函数对象将计算为true并使用匿名函数;如果callback
未定义,则不会创建匿名函数并通过未定义。
答案 4 :(得分:0)
这不是比较。 .animate()
是一种方法,所以括号中的所有项都是参数。