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