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

(function() {
  var foo = 'bar';
})();

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

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

例如将其改为此作品:

(function() {
  var foo = 'bar';
}());

问题

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

编辑 :这是对此的一些后续(我不会说完全重复): JSLint错误:“将调用移动到包含函数的parens” ,所以我的主要问题是#3,为什么它完全有效?

===============>>#1 票数:5 已采纳

我不知道Crockford的意见是如何形成的,但我可以解释为什么包裹在parens中。

JavaScript中的函数function() { ... }语法可以表示两种不同的东西:函数声明或函数表达式。

函数声明是一个语句 ,用于在指定名称下定义当前作用域内的函数。

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");
}();

===============>>#2 票数:1

1。

显然这是惯例的问题。 第一个例子显示“缺乏约定”( 来源 )。 就实际差异而言,没有。 两者都会毫无错误地执行。

2。

在这种情况下,我更喜欢你的第一个例子,但这只是我的惯例。 JSLint通常是正确的。 因此,如果您想遵循它们的命名约定,那么当它显示基于约定的警告时,符合约定是有意义的。

3。

此操作,因为包裹function(){}的内部()使得它的表达,其一旦与最终配对()立即调用它。 因此,您有一个立即调用的函数表达式。

  ask by Eran Medan translate from so

未解决问题?本站智能推荐: