当前位置: 首页 > 知识库问答 >
问题:

ES6立即调用了arrow函数

孙经艺
2023-03-14

为什么这在Node.js控制台(在4.1.1和5.3.0中测试)中工作,但在浏览器中不工作(在Chrome中测试)?

这个代码块应该创建并调用一个匿名函数,该函数记录Ok

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

另外,当上述操作在节点中工作时。js,这不起作用:

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

也不是这个:

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

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

共有3个答案

雷方伟
2023-03-14

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

> 3 + 2
< 5

在这里,它的执行就像是一个表达式,但您编写它就像它是一个语句。在普通脚本中,该值将被丢弃,但在这里,代码必须被内部损坏(比如用函数上下文和返回语句包装整个语句),这会导致各种奇怪的效果,包括您遇到的问题。

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

尝试在节点和Chrome控制台执行此操作:

{ let a = 3 }

在节点或a

({ let a = 3 })

那么它为什么要这样做呢?

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

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

这里有一个非常相似的例子:

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

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

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

夏朗
2023-03-14

如果没有括号,这些都不应该起作用。

为什么?

因为根据规范:

  1. 箭头函数列在AssignmentExpression下

因此,ArrowFunction不能位于CallExpression的LHS上。

这在how=

<罢工> 意义

  • x=

在巴贝尔身上也有一个关于它的错误。

沈建柏
2023-03-14

您需要使其成为函数表达式,而不是函数定义,函数定义不需要名称,并且使其成为有效的JavaScript。

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

是生命的等价物吗

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

以及这在节点中起作用的可能原因。js而不是Chrome是因为其解析器将其解释为一个自执行函数,如下所示

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

节点中工作正常。js。这是一个函数表达式,Chrome和Firefox以及大多数浏览器都是这样解释的。您需要手动调用它。

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

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

((n) => {
  console.log('Ok');
})()
 类似资料:
  • 主要内容:1.将函数转换为IIFE,2.IIFE的要点这是一个JavaScript函数,它会在定义后立即运行。 可以使用IIFE(立即调用函数表达式)来避免从块内部进行变量吊装。 它允许公开访问方法,同时保留函数中定义的变量的私密性。 IIFE是一种设计模式,也称为自执行匿名函数。它包含两个主要部分: 第一部分是具有词法范围的匿名函数,该函数包含在分组运算符中。 第二部分创建IIFE,JavaScript引擎将通过该IIFE直接解释该函数。 语法:

  • 问题内容: 有一个JSLint选项(实际上是The Good Parts之一),它“需要避免立即调用”,这意味着构造 而是需要写成 我的问题是-谁能解释为什么第二种形式可能会更好?它更具弹性吗?容易出错?与第一种形式相比,它有什么优势? 自问了这个问题之后,我开始理解在功能值和功能值之间进行清晰的视觉区分的重要性。考虑一下立即调用的结果在赋值表达式的右侧的情况: 尽管从语法上讲,最外面的括号不是必

  • 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行。 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为“自执行”,但作者后面说了很多,来说服大家称呼为“立即调用的函数表达式”。

  • 问题内容: 我试图创建一个看起来和感觉像标签项的链接,但运行一个函数而不是使用href。 当我尝试将onclick函数应用于链接时,无论该链接从未被单击过,它都会立即调用该函数。此后任何尝试单击链接的尝试都会失败。 我究竟做错了什么? HTML Java脚本 如您所见,我尝试了两种不同的方法来添加此onclick函数,这两种方法具有相同的效果。 问题答案: 你要 不 后者调用(执行),而前者在事件

  • 我没有看到这些构造使用很多,但我发现自己编写它们是为了在通常不会返回promise的函数中使用异步/等待 相对于 或 这是一件事吗?这里有我应该意识到的陷阱吗?在这种情况下使用async/wait的原因是什么?

  • 重试时间:io.reactivex.subjects.serializedsubject@35fb3008 subscribeNext 进程已完成,退出代码为0