为了账号安全,请及时绑定邮箱和手机立即绑定

javascript函数领先爆炸!句法

javascript函数领先爆炸!句法

翻翻过去那场雪 2019-09-19 09:49:03
我现在已经在一些库上看到了这种语法,我想知道它的好处是什么。(注意我很清楚闭包和代码在做什么,我只关心语法差异)!function(){  // do stuff}();作为更常见的替代品(function(){  // do stuff})();用于自我调用匿名函数。我想知道一些事情。首先,允许顶级示例实际工作的是什么?为了使这个陈述在语法上正确,为什么必要的爆炸?我也被告知+有效,我相信其他一些代替!第二,有什么好处?我所能说的只是它节省了一个角色,但我无法想象吸引众多采用者会带来如此巨大的好处。我还缺少其他一些好处吗?我可以看到的唯一其他差异是自调用函数的返回值,但在这两个示例中,我们并不真正关心函数的返回值,因为它仅用于创建闭包。那么有人可以告诉我为什么人们可能会使用第一种语法吗?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

理想情况下,您应该能够完成所有这些:


function(){

  // do stuff

}(); 

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


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


!function(){

  // do stuff

}(); 

或者为了好玩:


-function(){

  // do stuff

}(); 

要么:


+function(){

  // do stuff

}(); 

甚至:


~function(){

  // do stuff

  return 0;

}( );


查看完整回答
反对 回复 2019-09-19
?
当年话下

TA贡献1890条经验 获得超9个赞

在Javascript中,一行开头应该function是一个函数语句,看起来应该是这样的


function doSomething() {

}

像一个自我调用的功能


function(){

  // do stuff

}();

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


(function(){

  // do stuff

})();

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


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


查看完整回答
反对 回复 2019-09-19
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

除了已经说过的东西,语法与!如果您编写没有分号的javascript,则非常有用:


var i = 1

!function(){

  console.log('ham')

}()


i = 2

(function(){

  console.log('cheese')

})()

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


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


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


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 361 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信