ES6立即调用箭头函数

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

/密码 >

Node.js中运行良好。这是一个函数表达式,Chrome、 Firefox 和大多数浏览器都是这样解释的。您需要手动调用它。

您需要将其设置为 函数表达式函数表达式,而不是 函数定义函数定义,因为 函数定义函数定义不需要名称,而是一个有效的 JavaScript。

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

告诉解析器期望一个函数表达式的最普遍接受的方法就是用括号括起来,因为在 JavaScript 中,括号不能包含语句。此时,当解析器遇到 function 关键字时,它知道将其解析为函数表达式而不是函数声明。

等效于 生命

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

这种方法在 Node.js 中有效而在 Chrome 中无效的原因可能是因为它的解析器将其解释为一个自执行函数,如下所示

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

Node.js中运行良好。这是一个函数表达式,Chrome、 Firefox 和大多数浏览器都是这样解释的。您需要手动调用它。

关于 参数化版本,这将工作。

((n) => {
console.log('Ok');
})()
102150 次浏览

您需要将其设置为 函数表达式函数表达式,而不是 函数定义函数定义,因为 函数定义函数定义不需要名称,而是一个有效的 JavaScript。

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

等效于 生命

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

没有括号,这些都不行。

为什么?

这种方法在 Node.js 中有效而在 Chrome 中无效的原因可能是因为它的解析器将其解释为一个自执行函数,如下所示

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

Node.js中运行良好。这是一个函数表达式,Chrome、 Firefox 和大多数浏览器都是这样解释的。您需要手动调用它。

告诉解析器期望一个函数表达式的最普遍接受的方法就是用括号括起来,因为在 JavaScript 中,括号不能包含语句。此时,当解析器遇到 function 关键字时,它知道将其解析为函数表达式而不是函数声明。

因为根据说明书:

    关于 参数化版本,这将工作。

    ((n) => {
    console.log('Ok');
    })()
    
    Ricator.babeljs.io/t2118

巴别塔上也有一个关于它的窃听器。

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

之所以会出现这样的问题,是因为控制台本身试图模拟当前目标上下文的全局范围。它还尝试从您在控制台中编写的语句和表达式中捕获返回值,以便将返回值显示为结果。例如:

> 3 + 2
< 5

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

在这里,它的执行就好像它是一个表达式,但是您已经把它写成了一个语句。在正常的脚本中,这个值会被丢弃,但是在这里,代码必须在内部被破坏(比如用一个函数上下文和一个 return语句包装整个语句) ,这会导致各种奇怪的效果,包括你正在经历的问题。

下面是一个非常相似的例子:

这也是为什么一些脚本中的 ES6代码可以很好地工作,但是在 Chrome 开发工具控制台中却不行的原因之一。

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

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

{ let a = 3 }

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

在 Node 或 <script>标记中,它工作得很好,但在控制台中,它给出了 Uncaught SyntaxError: Unexpected identifier。它还以 VMxxx:1的形式提供了一个指向源的链接,您可以单击这个链接来检查所评估的源,这个链接显示如下:

({ let a = 3 })

那它为什么要这么做?

简而言之: 控制台试图尽可能准确地模拟全局执行上下文,但是由于与 v8引擎和 JavaScript 语义交互的限制,这有时很难或不可能解决。

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

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

我问了一个这样的问题:

下面是一个非常相似的例子:

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

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

@ getify 我有一个问题: 为了生成一个 # IIFE 模式,我们使用函数声明周围的参数将它转换成函数表达式,然后调用它。现在在箭头函数 IIFE 中,为什么我们需要 parans? !在默认情况下,箭头函数不是已经是一个表达式了吗? !

简而言之: 控制台试图尽可能准确地模拟全局执行上下文,但是由于与 v8引擎和 JavaScript 语义交互的限制,这有时很难或不可能解决。

ー getify (@getify) 2020年6月12日