当我用箭头函数重写时,为什么 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) 上的版本不起作用。
两者都有效,但你打错了:确保你写 (<function def>)()
let a = 3;
((b) => {
while(b--) console.log(b);
})(a);
(function(b){
while(b--) console.log(b);
})(a);
语言就是这样定义它的。正如 mdn 所述:
Although the arrow in an arrow function is not an operator, arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.
继续再举个例子,原理是一样的:
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);
什么是有效语法,什么是无效语法由语言决定 grammar。
一个CallExpression
定义为
MemberExpression Arguments
但是 ArrowFunction
不是 MemberExpression
,而是 AssignmentExpression
。
为什么 是这种情况将是 TC39 委员会的一个问题。
我有一个可用的 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) 上的版本不起作用。
两者都有效,但你打错了:确保你写 (<function def>)()
let a = 3;
((b) => {
while(b--) console.log(b);
})(a);
(function(b){
while(b--) console.log(b);
})(a);
语言就是这样定义它的。正如 mdn 所述:
Although the arrow in an arrow function is not an operator, arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.
继续再举个例子,原理是一样的:
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);
什么是有效语法,什么是无效语法由语言决定 grammar。
一个CallExpression
定义为
MemberExpression Arguments
但是 ArrowFunction
不是 MemberExpression
,而是 AssignmentExpression
。
为什么 是这种情况将是 TC39 委员会的一个问题。