JavaScript功能领先砰! 句法

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

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

作为更常见的替代方案

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

用于自我调用匿名函数。

我想知道几件事情。 首先,什么是允许顶级示例实际工作? 为了使这个语句在语法上正确,为什么需要爆炸? 我被告知也有+作品,而且我相信其他人会取代!

其次,有什么好处? 我所能说的是,它可以节省一个字符,但我无法想象这对吸引众多采用者是一个巨大的好处。 我还有其他一些好处吗?

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


理想情况下,你应该能够做到这一切只是因为:

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

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

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

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

或者为了好玩:

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

要么:

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

甚至:

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

在Javascript中,以function开头的行预计会是函数声明,应该看起来像

function doSomething() {
}

自我调用功能

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

不适合这种形式(并且会在第一个开放paren中导致语法错误,因为没有函数名),所以括号用于描述匿名函数表达式。

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

但是任何创建一个表达式(而不是函数声明)的东西都会这样做,因此! 。 它告诉解释者,这不是一个函数声明。 除此之外,运算符优先级指示在否定之前调用该函数。

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


除了已经说过的东西之外,与! 如果您不使用分号编写javascript,则会非常有用:

var i = 1
!function(){
  console.log('ham')
}()

i = 2
(function(){
  console.log('cheese')
})()

第一个示例按预期输出“ham”,但第二个示例会抛出错误,因为由于下面的括号,i = 2语句未终止。

同样在串联的JavaScript文件中,如果前面的代码缺少分号,则不必担心。 所以不需要共同的;(function(){})(); 确保你自己不会中断。

我知道我的答案有点晚了,但我认为它还没有被提及:)

链接地址: http://www.djcxy.com/p/96891.html

上一篇: javascript function leading bang ! syntax

下一篇: What is the purpose of a self executing function in javascript?