我现在已经在一些库上看到了这种语法,我想知道它的好处是什么。(注意我很清楚闭包和代码在做什么,我只关心语法差异)
!function(){
// do stuff
}();
作为更常见的替代品
(function(){
// do stuff
})();
用于自调用匿名函数。
我在想一些事情。首先,是什么让上面的例子真正起作用?为什么为了使这个陈述在语法上正确,bang是必要的?我还被告知,+的工作,我相信其他一些,在!
第二,好处是什么?我所知道的是,它节省了一个角色,但我无法想象这有如此大的好处来吸引大量的采用者。我还错过了什么好处吗?
我能看到的唯一的其他区别是自调用函数的返回值,但在这两个例子中,我们并不真正关心函数的返回值,因为它只用于创建一个闭包。有人能告诉我为什么要用第一种语法吗?
在Javascript中,以function开头的行应该是一个函数语句,看起来应该是这样的
function doSomething() {
}
像这样的自调用函数
function(){
// do stuff
}();
不符合该形式(并且会在第一个开括号处导致语法错误,因为没有函数名),因此括号用于描述匿名函数表达式。
(function(){
// do stuff
})();
但是任何创建表达式(而不是函数语句)的方法都可以,因此使用!。它告诉解释器这不是一个函数语句。除此之外,运算符优先级指示函数在求反之前调用。
我不知道这个惯例,但如果它变得普遍,它可能有助于可读性。我的意思是,任何在大块代码顶部阅读!函数的人都会期望自调用,就像我们在看到(function.;)除了这些烦人的圆括号。我认为这就是原因,而不是速度或角色数量上的节省。
因此,使用否定“!”和所有其他一元运算符,如+,-,~,delete, void,已经告诉了很多,只是总结一下:
!function(){
alert("Hi!");
}();
Or
void function(){
alert("Hi!");
}();
Or
delete function(){
alert("Hi!");
}();
还有一些使用二进制操作符的情况:)
1 > function() {
alert("Hi!");
}();
Or
1 * function() {
alert("Hi!");
}();
或
1 >>> function() {
alert("Hi!");
}();
甚至
1 == function() {
alert("Hi!");
}();
把三元留给其他人,伙计们:)
理想情况下,你应该能够简单地做到这一切:
function(){
// do stuff
}();
这意味着声明匿名函数并执行它。但由于JS语法的特殊性,这将不起作用。
因此,实现这一点的最短形式是使用一些表达式,例如UnaryExpression(以及CallExpression):
!function(){
// do stuff
}();
或者为了好玩:
-function(){
// do stuff
}();
Or:
+function(){
// do stuff
}();
甚至:
~function(){
// do stuff
return 0;
}( );