用于全局消除的匿名JavaScript函数

用于全局消除的匿名JavaScript函数,javascript,global-variables,Javascript,Global Variables,我在JavaScript语法中遇到了一些我不理解的奇怪之处 我试图使用一个匿名全局函数来进行全局减排,如下所示: <script type="text/javascript"> function() { alert("all code goes here"); }(); </script> 我的一位同事看到了这一点,摇了摇头,说“这是一个很好的人” 发生了什么事 var x=function(){..}() 这需要不带如下变量的括号 (函数(){…})(

我在JavaScript语法中遇到了一些我不理解的奇怪之处

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

<script type="text/javascript">
  function() {
    alert("all code goes here");
  }();
</script>
我的一位同事看到了这一点,摇了摇头,说“这是一个很好的人”

发生了什么事

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

这需要不带如下变量的括号

(函数(){…})()


编辑:与另一个问题相同,非常好。

基本上。。。Javascript要求您将函数放在某个地方

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

function foo(){}
或使用变量赋值语法:

var foo = function(){}
带有
()
的语法实际上只是第二种语法,但是您将结果扔掉,而不是存储在某个地方

这实际上相当于上面的陈述:

var foo = (function(){})

但是,如果不将赋值分配给某个对象,那么如果没有
()

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

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


这是一个简短的解释。如果您想要一个较长的版本,我建议您阅读。

因此基本上是为了消除函数声明和函数表达式之间的歧义

如果额外的大括号或变量介绍不适合您,您可以说服操作员为您完成这项工作:

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

这不是结束。闭包!=匿名函数。@delnan谢谢,编辑了标题。解释一下发生了什么会有帮助。可能是正确的重复,但这不是我想要的。本质上,我将页面的JavaScript代码放入函数中,并希望调用一次。这样我就不会用额外的变量污染全局名称空间。在您的示例中,我不在乎
foo
不是一个函数,但我需要它在加载页面时触发警报。“JavaScript中的每个函数实际上都是一个函数对象。”。如果要在加载页面时触发警报,可能需要使用“window.load=function(){…}”,谢谢。我的问题是为什么
函数(){}()语法不起作用。这是为什么。:)我想我明白了,但让我试着澄清一下。本质上,
function(){}
本身不会生成函数值,因为它是未赋值的。但是
var x=function(){}
function x(){}
do。这意味着
var x=function(){}
确实会转换成后一种形式,而不是首先计算右侧并将结果传递给x。听起来对吗?@Rich:我就是这么理解的
function(){}
是新函数对象的声明,该对象在求值时创建函数。将其存储在变量中时,将对其求值,或将其作为参数传递,或将其作为表达式求值。感谢您将其传递给我们。答案是“因为语法是这么说的”,这太糟糕了。我想,在设计动态语言时,很难做到这一点。
var foo = (function(){})
<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 = function(){return function(){alert("call");};}();
foo(); //works cause a function is assigned to foo
void function() {
    alert('hi');
}();