函数表达式在解析器中如何在Javascript中工作?

函数表达式在解析器中如何在Javascript中工作?,javascript,Javascript,最近我了解了这三件事之间的区别: var a = function() { ... }; function a() { ... }; var a = (function() { ... })(); 然而,我试图找出函数表达式在解析时的工作方式。也就是说,据我所知,如果我包括(function(){…})()在我的Javascript代码中的一行上,它将立即执行。这是真的吗 如果是这样,当解析器看到这一点时会发生什么?是因为函数被包装在括号中,还是因为附加了括号,还是其他原因?我在表3.7

最近我了解了这三件事之间的区别:

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

function a() { ... };

var a = (function() { ... })(); 
然而,我试图找出函数表达式在解析时的工作方式。也就是说,据我所知,如果我包括
(function(){…})()
在我的Javascript代码中的一行上,它将立即执行。这是真的吗

如果是这样,当解析器看到这一点时会发生什么?是因为函数被包装在括号中,还是因为附加了括号,还是其他原因?我在表3.7上读到,
()
new
是调用/创建某事物的新实例的一种方法,因此我可以获得与
(function(){…})相同的结果带有
新函数(…)?(忽略
new Function();
接受字符串这一事实)

如果我包括
(function(){…})()
在我的Javascript代码中的一行上,它将立即执行。这是真的吗

对。这叫一个

是因为函数被包装在括号中,还是因为附加了括号,还是其他原因

换行括号对执行没有意义,实际上可以(在使用结果时,为了避免函数声明的语法歧义)或。然而,“附加括号”只是一个普通的函数调用
解析为函数的任何东西
()

我阅读了表3.7中的MDN文档,其中()和new是调用/创建新实例的一种方法

对。不过

因此,我可以获得与
(function(){…})()相同的结果带有
新函数(…)


不。是一个完全不同的野兽。

你说的“在较低/语言级别”是什么意思?第三个是IIFE或立即调用函数表达式的示例。试着用谷歌搜索它,或者使用自调用函数。你想知道解析器是如何解析JavaScript代码的吗?我想你可以反编译浏览器。语言解析是一种相当有名的技术。除非我误解了你的意思,否则包装括号很重要,因为它们使它成为一个表达式而不是一个声明。你不能只写
函数f(){}()
@Alnitak:OP赋值给
var a
,所以它还是一个表达式。只有当它是表达式语句的顶级表达式时,它才有区别。我认为您的答案中丢失了一些上下文-当然,
var a=…
肯定是一个表达式,但您没有提到它,并且您的答案中以前唯一使用的
函数是
(function(){…})()
这显然需要括号。虽然我现在知道你的意思,但我认为你的答案仍然不清楚-看起来你指的是前面的
(function(){…})(
,而不是OP问题中省略的部分。@JoshuaSmock是的-附加的括号调用函数(表达式),和普通函数一样,函数调用也可以包含参数。