在很多书中/博客文章自调用匿名函数模式是这样写的:
(function() {
var foo = 'bar';
})();
然而运行JSLint对此给出了这个错误:
将调用移至包含该函数的括号中。
例如将其更改为这样的作品:
(function() {
var foo = 'bar';
}());
问题
- 为什么第一个实现对于 JSLint 来说不够好?有什么区别?
- 首选的形式是什么? JSLint 总是对的吗?
-
为什么它有效?毕竟
function(){}()
抛出一个SyntaxError: Unexpected token (
但是用括号包裹它会让它突然起作用吗?例如(function(){}()
)- 工作正常
(毕竟这是 JavaScript,而不是 Lisp,那么包装括号对其他语法错误有何影响?)
EDIT:这在某种程度上是对此的后续(但我不会说完全重复):JSLint 错误:“将调用移至包含该函数的括号中”,所以我的主要问题是#3,为什么它有效?
我不知道克罗克福德的观点是如何发展的,但我可以解释为什么用括号括起来是有效的。
功能function() { ... }
JavaScript 中的语法可以表示两种不同的事物:函数声明或函数表达式。
函数声明是一个陈述以指定名称定义当前作用域内的函数。
function example() {
alert("Hello World");
}
example();
函数表达式是一个表达评估为新的Function
实例。
var secondExample = function example() {
alert("Hello World");
};
secondExample();
example(); // <-- throws an Error: example is not defined.
语法的出现是函数声明还是函数语句取决于解析器的期望。 JavaScript 的解析器很简单。它不会向前看并注意到该函数后面是()
,因此它应该将其视为一个表达式。它只看到function
位于行的开头,因此将其视为一条语句,当其后跟随时会导致语法错误()
。当您将其括在括号中时,解析器会期待一个表达式,并且它可以工作。
用括号括起来(无论将它们放在哪里)是执行此操作的最清晰方法,但是任何导致解析器期望表达式的方法都可以工作。例如,按位 NOT 运算符~
:
~function() {
alert("Hello World");
}();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)