这些自执行匿名函数(又名IIFE)实现之间有什么区别

Era*_*dan 9 javascript

在许多书籍/ 博客文章中,自调用匿名函数模式的方式如下:

(function() {
  var foo = 'bar';
})();
Run Code Online (Sandbox Code Playgroud)

但是,在此上运行JSLint会出现此错误:

将调用移动到包含该函数的parens中.

例如将其改为此作品:

(function() {
  var foo = 'bar';
}());
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么第一个实现对JSLint来说不够好?有什么区别?
  2. 什么是首选形式?JSLint总是对的吗?
  3. 它为什么有效?毕竟function(){}()抛出一个SyntaxError: Unexpected token (
    但用parens包裹它会让它突然间起作用吗?eg (function(){}()) - 工作正常
    (毕竟这是JavaScript,而不是Lisp,所以包装parens对ohterwise语法错误的影响是什么?)

编辑:这是对此的一些后续(虽然我不会说完全重复):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 次

最近记录:

13 年,1 月 前