为了账号安全,请及时绑定邮箱和手机立即绑定

感叹号在功能之前做了什么?

感叹号在功能之前做了什么?

感叹号在功能之前做了什么?!function () {}();
查看完整描述

4 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

功能:

function () {}

什么都不返回(或未定义)。

有时我们想在创建函数时调用函数。你可能想尝试这个:

function () {}()

但它导致了一个SyntaxError

!在函数之前使用运算符会将其视为表达式,因此我们可以调用它:

!function () {}()

这也将返回与函数返回值相反的布尔值,在这种情况下true,因为!undefinedtrue。如果您希望实际返回值是调用的结果,那么尝试这样做:

(function () {})()


查看完整回答
反对 回复 2019-05-27
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

使用airbnb JavaScript指南!上标记的函数调用是一个很好的观点

通常在单独的文件(也称为模块)上使用此技术的想法,后来得到连接。这里需要注意的是,文件应该被工具连接起来,这些工具将新文件放在新行(这对于大多数连接工具来说无论如何都是常见的行为)。在这种情况下,!如果先前连接的模块错过了后续分号,则使用将有助于避免错误,但这样可以灵活地将它们置于任何顺序而不用担心。


!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*/}()


查看完整回答
反对 回复 2019-05-27
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

它返回语句是否可以计算为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


查看完整回答
反对 回复 2019-05-27
?
largeQ

TA贡献2039条经验 获得超7个赞

JavaScript语法101.这是一个函数声明

function foo() {}

请注意,没有分号:这只是一个函数声明。您需要一个调用foo()来实际运行该函数。

现在,当我们添加看似无害的感叹号时:!function foo() {}它将它变成一个表达式。它现在是一个函数表达式

!本身并不能调用该函数,当然,但我们现在可以把()结尾:!function foo() {}()它的优先级高于!并立即调用函数。

所以作者正在做的是为每个函数表达式保存一个字节; 一种更易读的写作方式是:

(function(){})();

最后,!使表达式返回true。这是因为在默认情况下所有IIFE回报undefined,这给我们留下了!undefined这是true。不是特别有用。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 907 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信