【问题标题】:JavaScript !function(){} [duplicate]JavaScript !function(){} [重复]
【发布时间】:2014-03-01 08:31:12
【问题描述】:

在查看缩小的 Sizzle 代码时,我注意到它的开头是这样的:

!function(a){//...

  }(window)

为什么开头有感叹号?

我认为!not 运算符。

谢谢。

编辑:

Full Code.

【问题讨论】:

  • 它是 NOT 运算符。介意显示整个代码吗?我猜这不是函数声明,而是 IIFE...
  • 你确定不是!function(){...return bool;}()
  • @p.s.w.g: 它不应该返回布尔值
  • 猜这应该是伪代码,但truefalse会做得更好,是的。
  • 对于上下文,代码是on github。如果您了解缩小的作用,那么我不会质疑看似晦涩的语法。

标签: javascript function sizzle


【解决方案1】:
!function(a){/* ... */}();

使用一元运算符调用 IIFE 是常见的做法。这是一个常见的简写形式:

(function(a){/* ... */}());

或:

(function(a){/* ... */})();

您也可以将非一元运算符替换为任何其他一元运算符:

-function(a){ /* ... */ }();
+function(a){ /* ... */ }();
/* ... etc. */

【讨论】:

  • 你的意思是!function() {}()!function(){} 不会调用它
  • @remyabel 闭包通常没有,当用作 IIFE 时几乎没有。实际上,(function Name () { ; }) () 是无效的,大多数人使用的“正常”功能语句(function name () { ; })只是var name = function () { ; } 的快捷方式。
  • 请注意!调用函数。其目的是使解析器将函数定义视为表达式,而不是语句。
  • @JohannesH.:在较旧的 IE 版本中确实如此(这是一个错误)。规范规定函数 expression 的名称仅在函数本身内可见。它非常适合调试和递归函数。
  • +1 但是要小心使用 +- 运算符,因为它们也被重载为二元运算符。因此,如果您在前一行省略分号,可能会产生不希望的结果。不重载的一元运算符最好,如!void~等。
【解决方案2】:

很好地解释了函数调用 https://github.com/airbnb/javascript/issues/44#issuecomment-13063933

!function () {}();

等价于

(function(){})();

除了作者节省了 1 个字节的代码。

在很多情况下,这是为了节省字节数。

!function aaa(){}()
!function bbb(){}();

和这个是一样的:

!function aaa(){}()
;(function bbb(){})();

注意“;”在最后一点。这是防御性的,因为它可以保护您的代码免受可能在它之前出现的失控 js 的影响。

有趣的是,我前段时间也问过同样的问题:

Came across a convention I've never seen. What does it do? !function

很好的参考: What does the exclamation mark do before the function?

【讨论】:

  • 仅供参考:在其他编程语言中,类似的事情很常见。例如,在 bash 脚本中,“什么都不做命令”(:)通常用于评估变量扩展。
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2022-11-01
  • 2011-04-01
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多