我在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。
答案 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