繁体   English   中英

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

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

jQuery.scrollTo.js库中查看此块(在第184行的v1.4中)。

function animate( callback ){
    $elem.animate( attr, duration, settings.easing, callback && function(){
        callback.call(this, target, settings);
    });
};

很想知道比较是如何工作的

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

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

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

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

JavaScript具有称为“短路逻辑表达式”的功能 如果逻辑表达式的一部分无法更改整体结果,则不会对其进行求值。

如果callback undefined ,则它在逻辑表达式的上下文中计算为false(它是“falsy” )。 因此,表达式变为等同于false && ... ,在这种情况下它不再重要...实际上,结果总是错误†1 在这种情况下,JavaScript并没有考虑...

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

所述callback.call()执行callback ,并且确定的含义thiscallback 所以callback.call(this)可以确保this指的是同一个对象作为外部函数。


†1 绝对正确:表达式的整体结果不会为false ,它将是undefined

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

这将检查回调是否真实(不是false,0,“”,null,undefined,NaN)并且如果它是真实的并且将评估语句的第二部分将返回将作为参数传递的函数。

例:

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

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

该运算符的实际行为稍微复杂一些。 它首先评估它的第一个操作数,即左边的表达式。 如果此表达式的值可以转换为false(例如,如果左操作数的计算结果为null,0,“”或undefined),则运算符将返回左侧表达式的值。 否则,它将计算其第二个操作数,即右侧的表达式,并返回该表达式的值。

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

expr1 && expr2

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM