【问题标题】:Assigning closure as default parameter using || throws a syntax error使用 || 将闭包分配为默认参数引发语法错误
【发布时间】:2018-03-06 05:11:25
【问题描述】:

我试图将闭包指定为参数的默认值,但想知道为什么以下会引发语法错误:

var myVar, myFunc;
// This throws a syntax error
myVar = myFunc || ()=>{};
console.log(myVar);

当以下功能相似的示例按预期工作时。

var myVar, myFunc, closure;
myVar = (myFunc !== undefined) ? myfunc : ()=>{};
console.log('1.', myVar); // ()=>{}

myVar = myFunc ? myfunc : ()=>{};
console.log('2.', myVar); // ()=>{}

myVar = myFunc || (()=>{});
console.log('3.', myVar); // ()=>{}

myVar = myFunc || function (){};
console.log('4.', myVar); // function(){}

closure = ()=>{};
myVar = myFunc || closure;
console.log('5.', myVar); // ()=>{}

我原以为分配闭包会像分配函数一样始终如一地工作,为什么直接将它与逻辑 OR 结合会引发语法错误?

【问题讨论】:

  • 也许它解析为好像它是无效的(myFunc || ()) => {};。也就是说=>运算符的优先级低于||

标签: javascript ecmascript-6 closures


【解决方案1】:

这是MDN上箭头函数语法的行为,Mozilla firefox产生错误

语法错误:无效的箭头函数参数(箭头函数周围的括号可能会有所帮助)

箭头函数周围的括号确实有帮助。我没有尝试破译 ECMASript 规范的内容来确定语法是如何以不可读的方式指定的。

【讨论】:

  • 谢谢 :) 从外观上看,闭包具有不同的解析规则,这些规则不同于通常的运算符优先级,也不同于常规函数的解析规则。
【解决方案2】:

您可以尝试将箭头函数包裹在括号中

var myVar, myFunc;
myVar = myFunc || (() => {});
console.log(myVar);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多