Javascript JS匿名函数调用语法

Javascript JS匿名函数调用语法,javascript,Javascript,这两者的区别是什么: (function () { alert('something'); })();​ # invocation parens after the wrapping parens 及 -两者都给了我相同的结果:提醒“某物”没有区别。两者都将执行完全相同的操作(调用匿名函数表达式) 匿名函数周围的括号只是为了确保函数被解析为表达式而不是声明(这很重要,因为声明不能被调用)。您还可能会看到使用了相同效果的其他操作符。例如: // All three of the fol

这两者的区别是什么:

(function () {
    alert('something');
})();​  # invocation parens after the wrapping parens


-两者都给了我相同的结果:提醒“某物”

没有区别。两者都将执行完全相同的操作(调用匿名函数表达式)

匿名函数周围的括号只是为了确保函数被解析为表达式而不是声明(这很重要,因为声明不能被调用)。您还可能会看到使用了相同效果的其他操作符。例如:

// All three of the following have the same effect:

!function () {
    alert('something');
}();​

+function () {
    alert('something');
}();​

(function () {
    alert('something');
}());​

请注意,如果您对问题中的第一个表单使用JSLint之类的静态分析工具(在分组运算符之外使用括号)。这是因为有些人认为第二种形式更容易理解。

将一些东西插入括号中(在JS中)迫使解释器将其视为表达式。

在第一种情况下,您强制解释器将函数视为表达式,然后解释器对其进行求值,得出它是函数的结论,然后进一步查看:
()
,因此它调用函数

在第二种情况下,您强制解释器将调用的paren也视为一个表达式,因此函数调用的结果将是表达式的结果,如果它将返回某些内容(否则它将是未定义的-感谢Elias van Ootegem)。

JSLint将
}视为一个表达式()调用为“错误”。函数定义和调用是单个表达式的一部分。仅出于这个原因,调用是表达式本身的一部分是非常合乎逻辑的

本质上,这只是个人偏好的问题。就我个人而言,我发现

(function(elem)
{
})(document.getElementById('foo'));
读起来比读起来容易

(function(elem)
{
}(document.getElementById('foo')));
但是,任何语法突出显示的编辑器都会使该参数无效

一句话:使用你觉得最舒服的,让jslint唠叨,道格拉斯·克罗克福德是JS的权威,但这并不意味着我们都必须盲目模仿他的风格/推理

没有功能上的区别。圆括号是使函数成为表达式所必需的,但它们在什么地方闭合并不重要。我从来不知道你也可以使用
+
用于此。很好的信息。你几乎可以使用任何操作符,这就是为什么
something=function(){}()将作为well@Cerbus,也可以使用位运算符:
~function(){}()经常被使用。使函数声明成为语句的一部分(从而使函数声明成为表达式的一部分)的任何操作都有效:
var ignoreMe=function(){}()也同样有效。但这就是它非常清楚的解释:+1的原因that@ShlomiSasson-
是“逻辑not”运算符,它将否定函数的返回值<代码>+
在此上下文中是一元加号运算符,它将函数的返回值转换为一个数字。@jamesalardice,那么您的意思是,上面的示例只是将这些运算符用作一种“技巧”,以使示例正常工作?(因为生成函数(){alert('something');}();​ 独自抛出一个错误)谢谢!因此,两者之间存在差异(不像上面提到的那样)-仅在返回值方面,我认为了解这一点很重要:)TA.@ShlomiSasson-分组运算符返回的内容有所不同。它将返回一个匿名函数(然后立即调用该函数)或该函数的返回值(因为它在评估组时被立即调用)。因此,这两者之间没有函数上的区别(您可以通过将表达式的结果赋给变量,然后检查其值来尝试)。函数调用的结果在JS中永远不会是
void
,如果没有显式
return
语句,函数将返回
undefined
。另外,看起来好像你确实说两种符号的计算方式不同,这种区别反映在表达式解析的值中,但事实并非如此:
(function(){}())
感谢你指出它返回
未定义的
,我的意思是,但是忘记了这个词。。。但我的意思是,这种区别反映在括号内表达式的结果中@EliasVanOotegemNo,我不是那个意思,尽管我必须承认我对此不是很清楚@埃利亚斯瓦诺特吉
(function(elem)
{
}(document.getElementById('foo')));