javascript 闭包中的 (...()) 与 (...)()

IT技术 javascript comparison closures anonymous-function jslint
2021-01-29 09:53:01

我知道这很愚蠢,但这两者之间有任何区别:

(function() {  
    var foo = 'bar';  
})();

还有这个?

(function() {  
    var foo = 'bar';  
}());

JSLint告诉我们要Move the invocation into the parens that contain the function,但我认为没有必要。

编辑:答案太酷了。~functionJSHint替代品以及 jQuery 的偏好(/***/)();和 Crockford 的解释!我以为我只会得到“它们是同一件事”这样的答案。
你们通过投票决定最好的一个,我勾选它。

3个回答

没有区别。两者都是让 JavaScript 解析器将您的函数视为表达式而不是声明的有效方法

请注意,+!也可以工作,有时被缩小器用来保存大小的字符:

+function() {  
    var foo = 'bar';  
}();

!function() {  
    var foo = 'bar';  
}();

编辑

正如@copy 指出的那样,为了完整性,~-将起作用。

-function() {  
    var foo = 'bar';  
}();

~function() {  
    var foo = 'bar';  
}();
为了完整起见,~-将这样做(所有一元运算符)。~当然是最酷的方式。
2021-03-15 09:53:01
哇,那个神秘的语法+1!如果他们在生产中看到它,那一定会让一些毫无戒心的编码人员挠头。那么它可以跨浏览器工作吗?它在规范中吗?我不明白为什么它有效。
2021-03-22 09:53:01
是的,你忘记了一个一元运算符!:D 但它不会使它更短或更清晰。jsfiddle.net/minitech/WL8tU/1(还有@CamiloMartin;你忘记了一个二元运算符。)
2021-03-25 09:53:01
@CamiloMartin - 是的,这只是让解释器不认为它是函数声明的一种技巧- 就像 `function() foo {}
2021-04-03 09:53:01
哦,还有一个更清楚一点的是void,虽然我讨厌那个关键字。(只是一个完整的列表。)jsfiddle.net/WL8tU/2
2021-04-11 09:53:01

之所以存在 JSLint 违规,是因为 Douglas Crockford 说外括号版本看起来像“狗球”。

你可以在这个视频中听到他的讨论

我认为这看起来很傻,因为我们谈论的是整个调用,但我们把这些东西挂在它外面,看起来有点像……狗球。

他建议里面的括号帮助读者理解整个语句是一个函数表达式而不是一个声明。

@Rob - 我知道他抱怨使用++. 很抱歉,但我会永远永远同意这一点。
2021-03-20 09:53:01
@AdamRackis - 我同意。我也不认为我会停止使用它。
2021-04-03 09:53:01
@Jared - 听起来像是你的压缩器中的一个错误。你用的是哪一个?
2021-04-05 09:53:01
我想要Ignore Douglas Crockford's preferencesJSLint 中复选框。
2021-04-07 09:53:01
@GlennMohammad 哪一页?遍?
2021-04-08 09:53:01

不,我不相信有任何区别。我个人更喜欢前者(jQuery 等人似乎也同意),但它们在我测试过的每个引擎中的工作方式都相同。

此外,JSLint 有时有点过于严格。在这方面,JSHint可能会好一些。

哦,不知道 JSHint。是的,只有在使用 JSLint 测试时编写的代码才能通过它,我似乎永远无法在检查之前避免错误。
2021-03-14 09:53:01