我该如何申报自我调用功能?

时间:2012-09-06 16:51:42

标签: javascript anonymous-function

我在Javascript中看到过这样的自调用函数:

(function () {
    // foo!
})();

但我也看到他们这样写:

(function () {
    // bar!
}());

从语法上讲,它们完全相同。实际上,我的个人习惯是第一种格式,但是我应该注意两者之间有什么区别吗?像浏览器纠结或其他什么?

例如,一个非常微不足道的事情是,如果第二种格式应该可靠地工作,那么这意味着这样的事情也应该是可能的:

function () {
    // shut the front door! saved two characters right there!
}();

虽然这对可读性造成了很大影响。

6 个答案:

答案 0 :(得分:4)

首先:

就像你假设的那样,你自我调用的匿名函数的前两个版本之间完全没有区别。没有浏览器克拉,怪癖,只是归结为个人偏好(道格拉斯克罗克福德称之为后者形式为“狗球”)。

第二

function() {
}()

将无法按设计工作,因为该语句会创建函数语句/声明。您需要函数表达式才能立即调用自身。要创建函数表达式,您可以执行多项操作。将整个语句放入括号中是一种方法,但您也可以编写

!function() {
}()

+function() {
}

所有这些操作符都会表达。

答案 1 :(得分:1)

前两个是相同的,但如果我没记错的话,jsLint会选择其中一个(我认为这是第二个)。

第三个在大多数口译员中提出syntax error,但还有其他变种:

!function() {
    alert('I’m executing myself!');
}();

var noname = function() {
    alert(noname); // undefined!
}();

您可以将!替换为+-(这些都不会让Crockford满意)

答案 2 :(得分:0)

这主要是一个惯例问题。

(function () {}());< - 执行前少一个堆栈帧(可能)

(function () {})();< - 在括号外执行,所以在执行前有一个小小的框架,虽然我不喜欢这种风格,IMO它在视觉上是断开的。

function () {}(); < - 这只是不好的做法IMO,这并不是很明显,这是一个IIFE,这主要是由于惯例,但这也有问题,如果你在表达式之前忘记分号,在某些条件下默默地为变量赋值undefined。

示例:

var x = 0,
    y = 1,
    z = 3,

function () {
    alert("Z is now undefined, instead of throwing a syntax error.");
}();

<击>

正如Andre Meinhold所说,这不是表达的位置。

答案 3 :(得分:0)

从语用上讲,JSLint会抱怨第一种格式,而不是第二种格式。除此之外,这里的个人偏好和一致性至关重要。

第三种格式将导致SyntaxError,因此您无法使用它。那是因为你创建了一个函数声明,而不是函数表达式。它是您在使用立即函数模式时调用的函数表达式。

答案 4 :(得分:0)

Crockford说使用(function () {...}())

这只是一种风格选择,但是,为了不同意使用Crockford的约会,并且(冒着开始火焰战争的风险)符合社区的利益?

答案 5 :(得分:0)

另外,请记住(function () { }());会增加潜在的混淆。因为在长期函数中,没有注意的人可能会看到两个右括号,只有一个被打开。