【问题标题】:Why does this Javascript line contain just the function name and the function call? [duplicate]为什么这个 Javascript 行只包含函数名和函数调用? [复制]
【发布时间】:2013-09-28 04:00:09
【问题描述】:

我正在阅读Twitter Bootstrap Tabs Plugin 的源代码,其中有一行似乎是某些东西的简写,但我不明白它是什么。这是来自源代码(版本 3.0.0)的 sn-p:

Tab.prototype.activate = function (element, container, callback) {
var $active    = container.find('> .active')
var transition = callback
  && $.support.transition
  && $active.hasClass('fade')

function next() {
  $active
    .removeClass('active')
    .find('> .dropdown-menu > .active')
    .removeClass('active')

  // some code removed for conciseness

  callback && callback()
}

有问题的行是这样的:callback && callback()

我从未见过像这样输入函数或变量名称,然后在 && 运算符之后调用函数。

我猜这是短手。它是什么以及它的用途是什么?它是如何工作的?

【问题讨论】:

  • callback() 只有在定义了回调函数时才会被调用
  • 它存在吗?如果是这样,请调用它。

标签: javascript jquery twitter-bootstrap


【解决方案1】:

的简写
if (callback)
{
   callback();
}

基本上,如果第一部分为 null(或未定义)且都等于 false,则 &&(逻辑与)失败并且什么也不做。

如果定义了回调,则 && 的第一部分为真,因此它计算第二部分(在这种情况下调用方法)。

这被称为 短路 作为逻辑 AND 运算符左侧的初始 false 意味着它不会尝试计算右侧表达式的第二部分 (因为它已经没有通过“一切都是真的”的测试)。注意:并非所有语言都在逻辑 AND 表达式中实现短路(VB 不是从内存中实现的),但 javascript 是明智的语言之一! :)

对于那些关心 undefined vs null vs 0 检查的细微之处的人:

http://www.sitepoint.com/javascript-truthy-falsy/

*免责声明:代码示例故意简单,并由训练有素的特技编码器执行。请不要在家里尝试这个。这很危险,可能会导致投票失败:)

【讨论】:

  • 不,不是,它只是检查未定义或空值,而不是虚假
  • 道歉使用更简单的!= null 而不是更冗长的“未定义”检查,但这对于解释来说都是不必要的,我发现一个丑陋的细节:)
  • 实际等效的代码实际上更短:if( callback ) callback()
  • 我有一个疑问!!callback 对我来说比回调更有意义,如果 undefined 为 false,回调如何处理,不是 falsy 而是 false?!!
  • @Esailija:练习的重点是给出一个清晰的解释,而不是最小的编码替代方案,但是我同意并且它避免使用 null 与“未定义”(我个人讨厌)
【解决方案2】:

&& 运算符的工作方式如下:

a && b
  1. 评估一个
  2. 如果 a 是假的,则返回 a
  3. 返回 Evaluate b 的结果

所以,你提到的那一行相当于:

如果回调的值为真,则将回调作为函数调用

如果您将回调作为非零数字、非空字符串或对象提供,您可以轻松地跳闸此代码,但如果您提供一个函数或什么都不提供(这是代码作者所期望的),那么它将起作用正确地调用回调(如果提供)。

编辑:

Truthy/Falsy 简述:

  • 假值:undefined、null、false、0、''、NaN
  • 真实价值观:其他一切

更多解释:http://www.sitepoint.com/javascript-truthy-falsy/

【讨论】:

  • 最好解释一下 truthyfalsy 这两个术语,因为很多人可能没有意识到这是 Javascript 行话(而不是幼儿园语言):)
【解决方案3】:
  • 所有对象都被认为是真实的。
  • 如果字符串为空,则认为字符串为假。
  • null 和 undefined 被认为是假的。
  • 如果数字为零,则该数字为假。

http://msdn.microsoft.com/en-us/library/ie/719e8e30%28v=vs.94%29.aspx

并且在逻辑 && 中,如果第一个为假,则整个语句也是如此。因此,如果没有 callback (false),则 && 的下一部分将不会执行(即 callback() 函数调用)!

【讨论】:

    【解决方案4】:

    同理:

    if (typeof callback != "undefined"){
        callback();
    }
    

    【讨论】:

      【解决方案5】:

      它将检查callback 是否存在,如果存在则运行它。原因是&& 运算符在第一个参数为假的情况下会短路。所以如果callback不存在就不会检查下半场

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多