繁体   English   中英

当我用箭头功能重写时,为什么不能将IIFE与Douglas Crockford的风格一起使用?

[英]Why can't an IIFE be used with Douglas Crockford's style when I rewrite it with an arrow function?

我有一个可以工作的IIFE,但是当我使用箭头功能重写它时,它不起作用!

1.-这个工作正常:

let j = 3;

(function (n) {
  while (n--)
    console.log("n only", n);
}(j));

2.-这个不起作用!:

((n) => {
  while (n--)
    console.log("n only", n);
}(j));

3.-我已经测试了下一个版本,它也有效:

((n) => {
  while (n--)
    console.log("n only", n);
})(j);

但我真的想明白为什么(2)上的版本不起作用。

这就是语言定义它的方式。 正如mdn所说:

虽然箭头函数中的箭头不是运算符,但箭头函数具有特殊的解析规则,与常规函数相比,它们与运算符优先级的交互方式不同。

它继续举另一个例子,但原则是相同的:

 let callback; callback = callback || function() {}; // ok callback = callback || () => {}; // SyntaxError: invalid arrow-function arguments callback = callback || (() => {}); // ok 

尽管Crockford表示倾向于将IIFE的右括号放在最后(在论证之后),但我个人觉得将它放在与箭头函数所需位置相同的位置(在结束括号之后)在争论之前)。

原因是括号的目的是将函数转换为函数表达式,因此参数在该转换中确实不重要。 所以这似乎更重要:

(function (n) => {
  while (n--)
    console.log("n only", n);
})(j);

什么是无效语法是由语言语法决定的。

CallExpression定义为

MemberExpression Arguments

但是ArrowFunction不是MemberExpression ,它是一个AssignmentExpression

为什么会出现这种情况对TC39委员会来说是一个问题。

两者都有效,但你写了一个错字:确保你写(<function def>)()

 let a = 3; ((b) => { while(b--) console.log(b); })(a); (function(b){ while(b--) console.log(b); })(a); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM