jQuery:What'在下面的代码块中比较的含义是callback&&function(){ca

jQuery: What's the meaning of comparison in following code block - callback && function() {callback.call();}

本文关键字:amp ca callback function What 在下面 代码 比较 jQuery      更新时间:2023-09-26

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

以及这背后的确切含义。提前谢谢。

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

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

JavaScript有一个名为"短路逻辑表达式">的功能。如果逻辑表达式的一部分不能改变整体结果,则不会对其进行求值。

如果callbackundefined,那么它在逻辑表达式的上下文中计算为false(它是"falsy">(。因此,表达式变成了false && ...的等价物,在这种情况下,...实际上是什么不再重要,结果将始终为false†1。在这种情况下,JavaScript并不关注...

如果callback而不是undefined(而是一个函数(,则逻辑表达式的第一部分求值为true(它是truthy">(。此时,JavaScript评估...。整体结果恰好是一个函数表达式。函数表达式产生一个匿名函数,然后将其传递给jQuery的animate()

callback.call()执行callback确定callbackthis的含义。因此callback.call(this)确保this引用与外部函数中相同的对象。


†1 绝对正确:表达式的总体结果将不是false,而是undefined

callback && function() {callback.call(...)}; 

这将检查回调是否为truthy(不是false,0,",null,undefined,NaN(,以及它是否为truth,并将计算语句的第二部分,该部分将返回将作为参数传入的函数。

示例:

var test = true && function() {};
console.log(typeof test); // "function"

当与布尔操作数一起使用时,&运算符执行布尔运算对两个值进行AND运算:当且仅当其第一个操作数和第二个操作数为真。如果如果这些操作数为false,则返回false。

这个操作员的实际行为有些复杂。它首先计算其第一个操作数,即左侧的表达式。如果该表达式的值可以被转换为false(例如,如果左操作数的计算结果为null、0、"或未定义(运算符返回左侧表达式的值。否则,它计算其第二个操作数,即右侧的表达式,然后返回该表达式的值。

因此,该表达式callback && function(){ callback.call(this, target, settings); }返回第二个匿名函数。这种语法的好处是能够在插件实例的上下文中调用callback函数。

expr1 && expr2

如果逻辑AND(&&(运算符可以转换为false,则返回expr1;否则返回expr2

现在,在您的示例中,callback中的函数对象将计算为true,并使用匿名函数;如果callback未定义,它将不会创建匿名函数并传递undefined。

这不是一个比较。.animate()是一个方法,因此括号中的所有项都是参数。