javascript 函数领先 bang !语法

2022-08-30 01:11:22

我现在已经在一些库上看到了这个语法,我想知道它有什么好处。(注意我很清楚闭包和代码在做什么,我只关心语法差异)

!function(){
  // do stuff
}();

作为更常见的替代方法

(function(){
  // do stuff
})();

用于自调用匿名函数。

我想知道一些事情。首先,是什么让顶级示例真正发挥作用?为什么为了使这个陈述在语法上正确,爆炸是必要的?我也被告知这有效,我相信还有其他一些,代替+!

二、好处是什么?我只能说它只保存了一个角色,但我无法想象这会吸引众多采用者带来如此巨大的好处。我错过了其他好处吗?

我能看到的唯一其他区别是自调用函数的返回值,但在这两个示例中,我们并不真正关心函数的返回值,因为它仅用于创建闭包。那么有人能告诉我为什么会使用第一种语法吗?


答案 1

理想情况下,您应该能够简单地完成所有这些操作:

function(){
  // do stuff
}(); 

这意味着声明匿名函数并执行它。但由于JS语法的细节,这将不起作用。

因此,实现这一点的最简短形式是使用一些表达式,例如UnaryExpression(以及CallExpression):

!function(){
  // do stuff
}(); 

或者为了好玩:

-function(){
  // do stuff
}(); 

艺术

+function(){
  // do stuff
}(); 

甚至:

~function(){
  // do stuff
  return 0;
}( );

答案 2

在Javascript中,以开头的行应该是函数语句,并且应该看起来像function

function doSomething() {
}

一个自调用函数,如

function(){
  // do stuff
}();

不适合该形式(并且会导致第一个开头的 paren 出现语法错误,因为没有函数名称),因此括号用于描述匿名函数表达式

(function(){
  // do stuff
})();

但是任何创建表达式(而不是函数语句)的东西都可以,因此.它告诉解释器这不是一个函数语句。除此之外,运算符优先级指示在否定之前调用函数。!

我不知道这个约定,但如果它变得普遍,它可能有助于可读性。我的意思是,任何阅读一大块代码顶部的人都会期望自我调用,就像我们已经习惯于在看到时期望相同的方式一样。除了我们将失去那些烦人的括号。我希望这就是原因,而不是在速度或字符数方面节省任何费用。!function(function