调用JavaScript函数表达式时,我看到了这些不同的模式:
var global = function () {
return this;
}();
var global = (function () {
return this;
}());
var global = (function () {
return this;
})();
在我的测试中,所有似乎都有效(至少在大多数当前的浏览器中)。对于我的“品味”,模式#3更好,因为它比#1更明确,它在实际调用之前返回函数,而不是#2。
但如果有一个首选或更正确的话,我就会徘徊......
答案 0 :(得分:2)
所以,最初的问题是下面的代码:
function () {
}();
引发异常。那是因为JS解析器无法自动确定它是函数声明还是函数表达式。您描述的所有模式都用于明确告诉JS“嘿伙计,这是一个表达”。但是在你特定的情况下你没有那个问题,因为如果你前面有一个变量,JS完全能够理解这是一个表达式,而不是声明,并且它不会引起任何语法错误。
在这种特定情况下,不需要任何“黑客”,你只需要:
var _global = function () {
}();
就是这样。 现在的问题是:当你需要一个没有任何变量的立即函数调用时,哪个“hack”使用?你描述的所有模式都没问题,Crockford倾向于选择这个模式:
(function(){
}());
这对我来说是有道理的,至少因为你有一个完整的孤立区块,相比之下:
(function(){
})();
但是,如果你将代码与其他脚本一起加入,或者你有以前的代码,如果他们最后不使用分号,你可能会遇到一些问题:
a = b + c
(function() {
}());
在这种情况下,JS会考虑c
函数的调用:
a = b + c(function() { }());
为避免这种情况,开发人员通常会在前面添加分号,以确保安全:
;(function() {
}());
我个人更喜欢运算符,比如bang(!):
!function () {
}();
因此您没有使用括号的问题。减少角色,给我一种“执行”感。但是,和其他方法一样,它是一个黑客,这是个人品味的问题。例如,克罗克福德不喜欢很多东西。
答案 1 :(得分:0)
他们一切正常,你可以使用其中任何一个,Crockford推荐的模式虽然是模式#2:
var global = (function () {
return this;
}());
我个人觉得Pattern#3易于使用,因为它很容易理解:
var global = (function () {
return this;
})();
BTW还有使用!
,+
等字符的其他模式/简写:
! function(){
return this;
}();
答案 2 :(得分:0)
我更喜欢模式一,因为将函数定义为对象属性的语法并且变得非常冗长。模式#1很容易遵循;你定义一个函数,然后调用它。模式3执行相同的操作,但需要使用额外的()
组。在我看来,这种冗长会导致生产成本。
正如你所说他们都是正确的但我觉得记住“奥卡姆的剃刀”=>很重要当所有事情都相同时,更简单的解释(表达)胜过更复杂的解释。