!function () {}();
当前回答
这是一个很好的使用点!用于airbnb JavaScript指南上标记的函数调用
一般来说,在单独的文件(也称为模块)上使用这种技术,这些文件稍后会被连接起来。这里需要注意的是,文件应该由将新文件放在新行的工具连接(无论如何,这是大多数concat工具的常见行为)。在这种情况下,使用!将有助于避免错误,如果之前连接的模块遗漏了尾随分号,那么这将提供将它们按任意顺序放置的灵活性,而无需担心。
!function abc(){}();
!function bca(){}();
工作原理与
!function abc(){}();
(function bca(){})();
但是节省了一个字符,而且随意看起来更好。
顺便说一下,在调用函数方面,任何+、-、~、void运算符都有相同的效果,当然,如果必须使用某个函数返回,它们的行为会有所不同。
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
但是如果您使用IIFE模式进行一个文件一个模块的代码分离,并使用concat工具进行优化(这使得一行一个文件的工作),那么构建
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
将执行安全的代码,与第一个代码示例相同。
这将引发错误,导致JavaScript ASI无法执行其工作。
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
关于一元运算符,需要注意的是,它们会做类似的工作,但仅在情况下,它们不会在第一个模块中使用。因此,如果您不能完全控制连接顺序,它们就不那么安全。
这是有效的:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
这不是:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
其他回答
这是编写IIFE(立即调用函数表达式)的另一种方式。
它的另一种写作方式-
(function( args ) {})()
等同于
!function ( args ) {}();
这是一个很好的使用点!用于airbnb JavaScript指南上标记的函数调用
一般来说,在单独的文件(也称为模块)上使用这种技术,这些文件稍后会被连接起来。这里需要注意的是,文件应该由将新文件放在新行的工具连接(无论如何,这是大多数concat工具的常见行为)。在这种情况下,使用!将有助于避免错误,如果之前连接的模块遗漏了尾随分号,那么这将提供将它们按任意顺序放置的灵活性,而无需担心。
!function abc(){}();
!function bca(){}();
工作原理与
!function abc(){}();
(function bca(){})();
但是节省了一个字符,而且随意看起来更好。
顺便说一下,在调用函数方面,任何+、-、~、void运算符都有相同的效果,当然,如果必须使用某个函数返回,它们的行为会有所不同。
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
但是如果您使用IIFE模式进行一个文件一个模块的代码分离,并使用concat工具进行优化(这使得一行一个文件的工作),那么构建
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
将执行安全的代码,与第一个代码示例相同。
这将引发错误,导致JavaScript ASI无法执行其工作。
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
关于一元运算符,需要注意的是,它们会做类似的工作,但仅在情况下,它们不会在第一个模块中使用。因此,如果您不能完全控制连接顺序,它们就不那么安全。
这是有效的:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
这不是:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
它返回语句的计算结果是否为false。如:
!false // true
!true // false
!isValid() // is not valid
您可以使用它两次将值强制为布尔值:
!!1 // true
!!0 // false
因此,为了更直接地回答您的问题:
var myVar = !function(){ return false; }(); // myVar contains true
编辑:它的副作用是将函数声明更改为函数表达式。例如,以下代码无效,因为它被解释为缺少所需标识符(或函数名)的函数声明:
function () { return false; }(); // syntax error
当我们进行javascript缩小时,这只是为了保存一个字节的数据。
考虑下面的匿名函数:
function (){}
为了使上述函数成为自调用函数,我们通常会将上述代码更改为:
(function (){}())
现在我们添加了两个额外的字符:(和),除了在函数末尾添加()之外,这是调用它所必需的。在缩小过程中,我们通常专注于减小文件大小。因此,我们也可以将上述函数写成:
!function (){}()
两者仍然是自调用函数,我们也保存了一个字节。我们只使用了一个字符!。
感叹号使任何函数始终返回布尔值。最后一个值是函数返回值的否定值。
!function bool() { return false; }() // true
!function bool() { return true; }() // false
省略!在上述示例中,将是SyntaxError。
function bool() { return true; }() // SyntaxError
然而,实现这一目标的更好方法是:
(function bool() { return true; })() // true
推荐文章
- Babel 6改变了它导出默认值的方式
- 如何配置历史记录?
- ES6模板文字可以在运行时被替换(或重用)吗?
- [Vue警告]:找不到元素
- 可以在setInterval()内部调用clearInterval()吗?
- AngularJS控制器的生命周期是什么?
- 无法读取未定义的属性“msie”- jQuery工具
- 我的蛋蛋怎么不见了?
- JavaScript中的排列?
- JavaScript中有睡眠/暂停/等待功能吗?
- 如何禁用文本选择使用jQuery?
- 如何停止事件冒泡复选框点击
- 如何在PHP中截断字符串最接近于一定数量的字符?
- 向对象数组添加属性
- 如何在Redux应用程序中动态加载代码分割的减速器?