JavaScript !function(){}
在查看缩小的sizzle代码时,我注意到它是这样开始的:
1 2 3
| !function(a){//...
}(window) |
为什么开头有感叹号?
我以为!是not的接线员。
谢谢您。
编辑:
完整的代码。
- 它是非操作员。能把整个代码都显示出来吗?我想这不是函数声明,而是生命…
- 你确定这不是!function(){...return bool;}()那样的东西吗?
- "?????????????????????????????????????????????????????????????
- @P.S.W.G:它不应该返回布尔值
- 我猜这是伪代码,但是true或false会更好,是的。
- 对于上下文,代码在Github上。如果你理解缩微的作用,那么我不会质疑看似晦涩的语法。
- 我不明白为什么这个问题会被否决。
- @Progo不是我,但很可能是因为你没有指定完整的代码,而且在结尾处漏掉了最重要的部分,并且在编辑后下选者没有返回。
1
| !function(a){/* ... */}(); |
使用一元运算符调用IIFE是常见的做法。这是一个常见的缩写:
1
| (function(a){/* ... */}()); |
或:
1
| (function(a){/* ... */})(); |
还可以用任何其他一元运算符替换非一元运算符:
1 2 3
| -function(a){ /* ... */ }();
+function(a){ /* ... */ }();
/* ... etc. */ |
- 你是说!function() {}()做!function(){}不会叫它
- 尤普,你在第一行的结尾处缺少了妄想症。
- 值得指出的是,函数没有名称。
- 看起来使用bang函数的性能也有所提高:jspef.com/bang-function
- @梅加瓦说得对,就是想这么做。谢谢你指出…
- @Remyabel闭合器通常没有一个闭合器,而且在用作生命时几乎没有。实际上,(function Name () { ; }) ()是无效的,大多数人使用的"正常"功能语句(function name () { ; })只是var name = function () { ; }的快捷方式。
- @约翰内斯:为什么埃多克斯1〔3〕无效?它是。
- 它是?哦,好吧,我必须承认,我从未测试过它。这还不是我认为有用的东西。好吧,那就忽略我的那部分评论吧。但其余部分仍然有效;)
- 请注意,!不调用该函数。它的目的是让解析器将函数定义视为表达式,而不是语句。
- @johannesh.:对于函数表达式,名称是可选的(这就是为什么大多数时候它被省略的原因),对于函数声明,它是必需的。
- @费利克斯克林很高兴知道,谢谢你的精心设计。
- hm.这确实意味着var func1 = function func2 () { ; }将函数分配给func1和func2并且两者都在当前范围内可见,不是吗?
- @约翰内斯:在旧的IE版本中是这样的(它是一个bug)。规范规定,函数表达式的名称只在函数本身内可见。它非常适合调试和递归函数。
- @费利克斯克林好消息,谢谢!
- @约翰内斯:不客气!好资源:kangax.github.io/nfe
- +1但要小心使用+和-运算符,因为它们也作为二进制运算符重载。因此,如果您在前一行中省略了分号,它可能会给出不希望得到的结果。不超载的一元运算符最好,如!、void、~等。
对函数调用给出了很好的解释https://github.com/airbnb/javascript/issues/44问题注释-13063933
等于
但作者正在保存1字节的代码。
在许多情况下,它是关于保存字节的。
1 2
| !function aaa(){}()
!function bbb(){}(); |
与此相同:
1 2
| !function aaa(){}()
;(function bbb(){})(); |
注意最后一位的";"。这是防御性的,因为它可以保护您的代码免受失控的JS的攻击。
有趣的是,我之前也问过这个问题:
遇到了一个我从未见过的会议。它做什么?函数!
很好的参考资料:感叹号在函数之前做什么?
- 仅供参考:在其他编程语言中,类似的事情很常见。例如,在bash脚本中,"do nothing command"(:通常用于评估变量扩展。