javascript功能领先!句法

2020/10/16 09:01 · javascript ·  · 0评论

我现在已经在一些库中看到了这种语法,我想知道这样做有什么好处。(请注意,我非常了解闭包以及代码在做什么,我只关心语法上的差异)

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

不适合这种形式(并且由于没有函数名,将在第一个打开括号中引起语法错误),因此使用方括号来描述匿名函数表达式

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

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

我没有意识到这个约定,但是如果它变得普遍,则可能有助于提高可读性。我的意思是,任何阅读!function大量代码顶部的人都将期望自我调用,这是我们已经习惯在看到时也期望同样的方式(function除了我们将丢失那些令人讨厌的括号。我希望这是原因,而不是节省速度或字符数。

除了已经说过的话,带!的语法。如果您编写不带分号的javascript很有用:

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

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

第一个示例按预期输出'ham',但是第二个示例将引发错误,因为由于以下括号,i = 2语句未终止。

同样,在串联的javascript文件中,您不必担心前面的代码是否缺少分号。因此,不需要通用的;(function(){})(); 确保您自己不会崩溃。

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

一方面,jsPerf显示使用!(UnaryExpression's)通常更快。有时他们出来是平等的,但是当他们都没有,我还没有看到非拍着一个胜利太多比其他尚未:http://jsperf.com/bang-function

这是在最新的Ubuntu(具有最老版本的Chrome)(版本8)上进行的测试。因此结果当然有所不同。

编辑:疯狂的东西怎么样delete

delete function() {
   alert("Hi!"); 
}();

还是void

void function() {
   alert("Hi!"); 
}();

正如你可以看到这里,做在JavaScript自调用的方法是用最好的方式:

(function(){}()); -> 76,827,475 ops/sec

!function(){}();  -> 69,699,155 ops/sec

(function(){})(); -> 69,564,370 ops/sec

因此,与否定“!” 以及所有其他一元运算符,例如+,-,〜,delete,void,已经被告知很多,只是总结一下:

!function(){
  alert("Hi!");
}(); 

要么

void function(){
  alert("Hi!");
}();

要么

delete function(){
  alert("Hi!");
}();

还有更多使用二进制运算符的情况:)

1 > function() {
   alert("Hi!"); 
}();

要么

1 * function() {
   alert("Hi!"); 
}();

要么

1 >>> function() {
   alert("Hi!"); 
}();

甚至

1 == function() {
   alert("Hi!"); 
}();

将三元数留给其他人:)

本文地址:http://javascript.askforanswer.com/javascriptgongnenglingxianjufa.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!