使用Javascript函数表达式的首选方法是什么?

时间:2012-06-03 15:26:32

标签: javascript function-expression

调用JavaScript函数表达式时,我看到了这些不同的模式:

模式#1

var global = function () {
    return this;
}();

模式#2

var global = (function () {
   return this;
}());

模式#3

var global = (function () {
    return this;
})();

在我的测试中,所有似乎都有效(至少在大多数当前的浏览器中)。对于我的“品味”,模式#3更好,因为它比#1更明确,它在实际调用之前返回函数,而不是#2。

但如果有一个首选或更正确的话,我就会徘徊......

3 个答案:

答案 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执行相同的操作,但需要使用额外的()组。在我看来,这种冗长会导致生产成本。

正如你所说他们都是正确的但我觉得记住“奥卡姆的剃刀”=>很重要当所有事情都相同时,更简单的解释(表达)胜过更复杂的解释。