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?