[英]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.