jQuery:以下代码块中比较的含义是什么 - callback&& function(){callback.call();}

时间:2011-11-30 10:41:09

标签: javascript jquery

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(...)}; 

这背后的意义究竟是什么。提前谢谢。

5 个答案:

答案 0 :(得分:6)

callback && function() {callback.call(...)};正在做两件事:

  • 测试是否已定义callback
  • 如果有,请在正确的上下文中调用

JavaScript有一个名为"短路逻辑表达式" 的功能。如果逻辑表达式的一部分无法更改整体结果,则不会对其进行评估。

如果callbackundefined,那么它在逻辑表达式的上下文中评估为false(它是" falsy" ) 。所以表达式相当于false && ...,在这种情况下,...实际上不再重要,结果总是假的†1 。在这种情况下,JavaScript不会查看...

如果callback 不是 undefined(但是函数),则逻辑表达式的第一部分的计算结果为true(它的&# 34; truthy" )。此时,JavaScript会评估...。总体结果恰好是函数表达式。函数表达式产生一个匿名函数,然后传递给jQuery的animate()

callback.call()执行callback 确定thiscallback的含义。因此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()是一种方法,所以括号中的所有项都是参数。