在许多书籍/ 博客文章中,自调用匿名函数模式的方式如下:
(function() {
var foo = 'bar';
})();
Run Code Online (Sandbox Code Playgroud)
但是,在此上运行JSLint会出现此错误:
将调用移动到包含该函数的parens中.
例如将其改为此作品:
(function() {
var foo = 'bar';
}());
Run Code Online (Sandbox Code Playgroud)
问题
function(){}()抛出一个SyntaxError: Unexpected token ( function(){}()) - 工作正常
编辑:这是对此的一些后续(虽然我不会说完全重复):JSLint错误:"将调用移动到包含该函数的parens",所以我的主要问题是#3,为什么它完全有效?
小智 5
我不知道Crockford的意见是如何形成的,但我可以解释为什么包裹在parens中.
function() { ... }JavaScript中的函数语法可以表示两种不同的东西:函数声明或函数表达式.
函数声明是一个语句,用于在指定名称下定义当前作用域内的函数.
function example() {
alert("Hello World");
}
example();
Run Code Online (Sandbox Code Playgroud)
函数表达式是一个求值为新实例的表达式Function.
var secondExample = function example() {
alert("Hello World");
};
secondExample();
example(); // <-- throws an Error: example is not defined.
Run Code Online (Sandbox Code Playgroud)
语法的出现是函数声明还是函数声明取决于解析器的期望.JavaScript的解析器很简单.它不会向前看并注意到函数后跟(),因此它应该将其视为表达式.它只是function在一行的开头看到,因此将其视为一个语句,当它跟随时会导致语法错误().当你将它包装在括号中时,解析器会期望一个表达式,并且它可以工作.
用括号括起来(无论你放在哪里)都是最清楚的方法,但是任何导致解析器期望表达式的东西都会起作用.例如,按位NOT运算符~:
~function() {
alert("Hello World");
}();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |