【问题标题】:IIFE with unary operator: real world use case [duplicate]带有一元运算符的 IIFE:真实世界用例 [重复]
【发布时间】:2014-11-22 13:17:18
【问题描述】:

我们可以假装使用一元运算符作为 IIFE,如下所示:

+function(){
   return 5;
}();//5


-function(){
   return 5;
}();//-5


~function(){
   return 5;
}();//-6


!function(){
   return 5;
}();//false

那么,这种 IIFE 是否存在实际用例,或者我们应该通过使用一元运算符来避免使用 IIFE,而只使用真正的 IIFE:

(function(){
   return 5;
}()); //5

【问题讨论】:

  • 绝对没有区别,所以使用你认为最漂亮的那个。
  • 使用一元运算符在返回结果时会有所不同,所以我认为编程一定有美......
  • 所有这些代码都做同样的事情:运行函数并丢弃结果。一元运算符(或周围的括号)是必需的,但它们都做同样的事情。
  • 是的,有一个不是在代码执行中而是在字符长度中,一些缩小器实际上使用它,因为您使用 !,+,- 等作为前缀保存 1 个字符,因为它允许删除包装括号。
  • 你到底在说什么

标签: javascript


【解决方案1】:

我的 IDE 对 +function() 的事情不满意:

JSLint 和 JSHint 也是如此。最好避免这样的结构,因为:

  • 它们让读者感到困惑
  • 它们混淆了 IDE 和验证器
  • 您不能从这样的 IIFE 返回任何有意义的内容(例如,对象,这是迄今为止最常见的用例)。

【讨论】:

    【解决方案2】:

    对我来说,使用带运算符的 IIFE 的唯一好处是,如果我忘记使用不会导致问题的尾随分号。

    但是使用不带运算符的 IIFE 如果我忘记使用尾随分号,那将是一个问题。

    (function(){
    ...
    }()) //no semi-colon
    (function(){
    ...
    }());
    

    前面的代码将被解释为函数调用。 (第一个 IIFE 是要调用的函数,第二个是参数)


    自从@georg 回答以来,在大多数用例中,这种 IIFE 没有有意义的回报,我会选择将 IIFE 与运算符一起使用。

    【讨论】:

    • 我不知道为什么这被否决了。英文不完美,但答案是正确的:JavaScript 中的(fn-expr) 可以根据 ASI 规则与上一行连接,这是危险的;一般来说,建议您手动在 before 行之前添加一个分号,并以括号或方括号开头。在 IIFE 的情况下,括号的唯一目的是强制函数 expression-parsing 而不是 statement-parsing;并且在 ASI 环境中使用一元操作比 parens 更可靠地实现这一点。
    • @ELLIOTTCABLE 我猜它被低估了“如果我忘记使用不会导致问题的尾随分号”的说法。使用令人困惑的非标准技巧来规避对分号的需求似乎有点疯狂。
    • 这并不疯狂,丹,这是完美的标准做法。查看仅包含单个 UnaryExpression 的 StatementListItems 的大型 JavaScript 项目。 (另外,请不要使用像“疯狂”这样的贬义词;这是有能力的,而且很糟糕。)
    • (即使忽略您的语言,以及您对 FunctionExpression 产品的一元选择的不熟悉,您至少必须意识到对 ASI 的依赖是绝对我们行业的标准做法?无论您个人是否选择使用它,那些这样做选择的人通常会竭尽全力避免不必要的分号……这不是“疯狂”,而是努力朝着代码风格的一致性迈进,这在大型共享代码库中无疑是一件好事。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2010-11-23
    • 2011-02-27
    • 2012-01-07
    • 2016-11-26
    相关资源
    最近更新 更多