我在Javascript中看到过这样的自调用函数:
(function () {
// foo!
})();
但我也看到他们这样写:
(function () {
// bar!
}());
从语法上讲,它们完全相同。实际上,我的个人习惯是第一种格式,但是我应该注意两者之间有什么区别吗?像浏览器纠结或其他什么?
例如,一个非常微不足道的事情是,如果第二种格式应该可靠地工作,那么这意味着这样的事情也应该是可能的:
function () {
// shut the front door! saved two characters right there!
}();
虽然这对可读性造成了很大影响。
答案 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 () { }());
会增加潜在的混淆。因为在长期函数中,没有注意的人可能会看到两个右括号,只有一个被打开。