用于全局减排的匿名JavaScript函数

时间:2010-11-01 15:11:25

标签: javascript global-variables

我在JavaScript语法中遇到了一些我不理解的陌生感。

我试图使用一个匿名的全局函数进行全局减排,如下所示:

<script type="text/javascript">
  function() {
    alert("all code goes here");
  }();
</script>

不幸的是,我收到语法错误。这解决了它:

<script type="text/javascript">
  var MAIN = function() {
    alert("all code goes here");
  }();
</script>

但是不满意,因为现在有一个全局MAIN对象。然后我碰到了这个:

<script type="text/javascript">
  (function() {
    alert("all code goes here");
  })();
</script>

我的一位同事看到了这一点,摇了摇头说“这是一些语法手法”。

发生了什么

var x = function() { .. }();

需要没有像这样的变量的括号

(function() { ... })();

编辑:与其他问题相同,使用此answer

4 个答案:

答案 0 :(得分:3)

问题是function() {}()被解析为函数声明。在函数声明中,函数名称是必需的,因此在此处缺少函数名称会出现语法错误。在function() {}()周围放置括号可以通过强制将内部代码解析为表达式来解决问题:括号充当分组运算符,其中只有表达式有效。

function() {}()放置在赋值的右侧也是出于类似的原因:只有表达式在那里有效,因此该函数被解析为表达式。

这是一个简短的解释。如果您想要更长的版本,我建议您阅读CMS's excellent explanation in another question

答案 1 :(得分:1)

基本上...... Javascript要求你把你的功能放在某个地方。

您可以使用常规命名语法执行此操作:

function foo(){}

或者使用变量赋值语法:

var foo = function(){}

()的语法实际上只是第二种语法,但是你扔掉结果而不是把它存储在某个地方。

这实际上等同于上面的陈述:

var foo = (function(){})

但是,如果你没有将作业分配给某些作品,那么没有()就无法作出作业。

答案 2 :(得分:1)

所以原因基本上是消除函数声明和函数表达式之间的歧义。

如果额外的括号或变量介绍不适合你,总会有一个操作员,你可以说服你为你做的工作:

void function() {
    alert('hi');
}();

答案 3 :(得分:0)

<script>
var foo = function(){alert("call");}();
var foo2 = function(){alert("call");};
console.log(foo2);
console.log(foo);

//foo(); //<-bad, foo not a function
console.log(function(){return "json";}());
</script>

var foo未定义,因为没有返回值; 如果我们这样做:

var foo = function(){return function(){alert("call");};}();
foo(); //works cause a function is assigned to foo