首页 文章

ES6立即调用了箭头功能

提问于
浏览
100

为什么这在 Node.js 控制台中运行(在4.1.1和5.3.0中测试)但在浏览器中不起作用(在Chrome中测试)?此代码块应创建并调用记录 Ok 的匿名函数 .

() => {
  console.log('Ok');
}()

另外,虽然节点中的上述 works ,但这不起作用:

n => {
  console.log('Ok');
}()

这不是:

(n) => {
  console.log('Ok');
}()

奇怪的是,当添加参数时,它实际上会在立即调用的部分抛出 SyntaxError .

3 回答

  • 2

    您需要将其设为 function expression 而不是 function definition ,它不需要名称并使其成为有效的JavaScript .

    (() => {
      console.log('Ok');
    })()
    

    相当于IIFE

    (function(){
       console.log('Ok')
    })();
    

    并且可能的原因是它在Node.js中工作但不在chrome中工作是因为它的解析器将其解释为自执行函数,因为

    function() { console.log('hello'); }();
    

    在_596837中工作正常_这是一个函数表达式和chrome和firefox,大多数浏览器都是这样解释的 . 您需要手动调用它 .

    告诉解析器期望函数表达式的最广泛接受的方式就是将它包装在parens中,因为在JavaScript中,parens不能包含语句 . 此时,当解析器遇到function关键字时,它知道将其解析为函数表达式而不是函数声明 .

    关于 parametrized version ,这将有效 .

    ((n) => {
      console.log('Ok');
    })()
    
  • 17

    没有括号,这些都不适用 .

    为什么?

    因为根据规范:

    所以ArrowFunction不能在CallExpression的LHS上 .


    这有效地意味着如何解释 => ,它的工作方式与赋值运算符 =+= 等相同 .

    含义

    x => ()不成为(x => )()解释器试图将其解释为x =>(())因此它仍然是一个SyntaxError因此解释器决定(肯定是错误的并抛出一个SyntaxError


    Babel也有一个关于它的错误here .

  • 115

    您遇到这样的问题的原因是控制台本身会尝试模拟您当前定位的上下文的全局范围 . 它还尝试从您在控制台中编写的语句和表达式中捕获返回值,以便显示为结果 . 举个例子:

    > 3 + 2
    < 5
    

    在这里,它执行就好像它是一个表达式,但你已经把它写成了一个声明 . 在普通脚本中,该值将被丢弃,但在这里,代码必须在内部进行修改(比如用函数上下文和 return 语句包装整个语句),这会导致各种奇怪的效果,包括您遇到的问题 .

    这也是为什么脚本中的一些裸ES6代码工作正常但在Chrome Dev Tools控制台中没有的原因之一 .

    尝试在Node和Chrome控制台中执行此操作:

    { let a = 3 }
    

    在Node或 <script> 标签中它可以正常工作,但在控制台中,它给出 Uncaught SyntaxError: Unexpected identifier . 它还以 VMxxx:1 的形式为您提供了源的链接,您可以单击该链接以检查已评估的源,该源显示为:

    ({ let a = 3 })
    

    那么为什么会这样呢?

    答案是它需要将代码转换为表达式,以便结果可以返回给调用者并显示在控制台中 . 你可以通过将语句包装在括号中来实现这一点,这使得它成为一个表达式,但它也使语句在句法上不正确(表达式不能有块声明) .

    控制台确实试图通过对代码的智能来修复这些边缘情况,但我认为这超出了这个答案的范围 . 你可以提交一个错误,看看他们是否考虑修复这个问题 .

    这是一个很相似的例子:

    https://stackoverflow.com/a/28431346/46588

    使代码工作的最安全方法是确保它可以作为表达式运行,并检查 SyntaxError 源链接以查看实际执行代码是什么,并从中反向设计解决方案 . 通常它意味着一对策略性地放置的括号 .

    In short: 控制台尝试尽可能准确地模拟全局执行上下文,但由于与v8引擎和JavaScript语义交互的限制,这有时很难或无法解决 .

相关问题