Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在express js中间件中调用函数表达式会被挂起?

为什么在express js中间件中调用函数表达式会被挂起?
EN

Stack Overflow用户
提问于 2019-08-05 20:41:01
回答 1查看 180关注 0票数 2

我们知道函数声明是被提升的,你可以在脚本中的任何地方调用它们。对于函数表达式,情况并非如此。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 test();

 const test = () => {
    console.log(1+3);
 }

 When we call test() it will always return undefined.

但是,当我们在expressjs中间件中调用相同的函数时,这种情况就不会发生。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
router.get('/', (req, res, next) => {
   test(); // it will return always the result 4
})

const test = () => {
   console.log(1+3);
}

有人能给我解释一下为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2019-08-05 21:23:37

您的第一个代码片段在完全按照您显示的方式运行时,会生成以下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ReferenceError: test is not defined

您的第二个代码片段之所以可以工作,是因为模块已经初始化,并且定义了const test。一段时间后,路由回调被调用,test现在被定义,并且在模块范围内有一个值。

对于letconst,在初始化之前在运行代码中引用它们是错误的。这就是为什么第一个代码片段会生成一个ReferenceError

但是,一旦初始化,它们就可以在定义它们的作用域内的任何地方使用。一些人称这是提升到范围的顶端。因为这与var提升的工作方式不同,所以我只是认为,一旦定义了constlet符号,它就可以在其作用域内的任何地方使用,甚至可以在稍后调用的代码中使用,但在文件中出现得更早。这与Javascript的运行时变量查找是一致的。在第二个代码片段中执行路由处理程序时,将在其作用域内动态查找符号test。由于在调用路由处理程序时,const test已经运行并被初始化,因此它会找到一个已经初始化的test变量,并且test()工作得很好。

在您的第一个代码片段中,test的动态查找失败,因为当您尝试调用test()并创建ReferenceError时,const test尚未运行。

您可以在下面的代码中看到更简单的演示,它与您的第二个代码片段几乎相同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function a() {
    test();
}

const test = () => {
    console.log(1+3);
}

a();

在这里,我们定义函数a,然后将const test定义为函数。然后,我们调用a(),而后者又调用test()。由于事件的顺序是:

  1. 定义函数
  2. 将const
  3. 定义为测试,然后调用test()

而且,所有的符号都可以从模块作用域访问,这样你就可以看到test在被调用之前就已经定义好了,所以代码可以正常工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57365822

复制
相关文章
JSON数据获取指南!
在互联网时代,数据是金钱的来源。然而,要从海量的网页中提取需要的数据并不容易。本文将带你了解如何使用Node.js编写简易爬虫程序,帮助你轻松获取并处理JSON数据,让你不再为数据发愁。
用户614136809
2023/09/25
3840
jsonp获取json数据
这两天做微信端JS接口,当时遇到的第一个问题就是权限验证的参数请求,当你请求access_token等的时候,就会存在跨域问题:然后在网上查了,采用ajax的jsonp进行跨域请求,后来报错了,返回的结果错误。然后认真看了一下文档,发现ajax的jsonp返回的数据是callback(json),卡到这里。最后同时为了安全的考虑,我就将这一部分的权限验证参数在后端做,然后前端请求,这样就避免了跨域,同时将安全考虑进去了。
Rattenking
2021/01/29
2.4K0
burpsuite 无法获取本地数据
当Firefox和burpsuite设置代理地址127.0.0.1,端口:80内容可以显示在firefox网页而无法在burpsuite显示,求教是什么原因?
用户7446386
2020/06/09
2.2K0
Jquery 使用getJSON 获取json数据
1.先引用jq获取下载到本地 CDN地址:https://code.jquery.com/jquery-latest.js
Alone88
2019/10/22
3.5K0
zabbix的server无法获取数据
背景 部署完Zabbix agent之后,Server无法获取到数据 报错 服务端 [root@hf-01 ~]# zabbix_get -s 192.168.202.131 -p 10050 -k 'my.estab.count' zabbix_get [3088]: Get value error: cannot connect to [[192.168.202.131]:10050]: [113] No route to host [root@hf-01 ~]# 分析 服务端ping
运维小白
2022/01/06
1.7K0
Selenium+BeautifulSoup+json获取 Script 标签内的 json 数据
Selenium爬虫遇到 数据是以 JSON 字符串的形式包裹在 Script 标签中, 假设Script标签下代码如下:
诡途
2022/05/09
3.3K0
BeautifulSoup 获取 Script 标签内的 json 数据
有时候,我们可能会遇到数据是以 JSON 字符串的形式包裹在 Script 标签中,此时使用 BeautifulSoup 仍然可以很方便的提取。
happyJared
2019/11/03
4.7K0
JavaScript 递归遍历json串获取相关数据
url: "/home/level4Menu1",
授客
2019/11/18
3.4K0
JavaScript 递归遍历json串获取相关数据
python-获取URL中的json数据
数据源为某系统提供的URL,打开是json文件,python代码获取如下: URL替换成自己的即可。 import urllib.request def get_record(url): resp = urllib.request.urlopen(url) ele_json = json.loads(resp.read()) return ele_json if __name__ == '__main__': print(get_record('http://abc.co/
py3study
2020/01/16
5.5K0
Js解析Json数据获取元素JsonPath与深度
JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java,JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。
大道七哥
2020/03/28
13.6K0
Js解析Json数据获取元素JsonPath与深度
php的json_decode函数无法解析json
作者:matrix 被围观: 5,526 次 发布时间:2014-09-04 分类:零零星星 | 9 条评论 »
HHTjim 部落格
2022/09/26
2K0
[接口测试 - 基础篇] 04 无法绕过的json解析
概述 我们先看一下什么是json。 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 JSON 语法规则 在javascript语言中,一切都是对象。因此,任何
苦叶子
2018/04/09
3.1K0
解决mybatis 无法映射 数据库 json字段的问题
1.前言 MySQL从5.7版本之后开始支持JSON数据类型,相比于JSON格式的字符串类型有如下优势:存储在JSON列中的JSON文档的会被自动验证。无效的文档会产生错误;最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。 2.背景 mybatis目前还不支持映射json的数据格式,需要我们自己进行增强 3.实现 对mybatis TypeHandler进行增强 3.1ListStringTypeHandler 核心代码 package com.xxx.xxx.pip
特特
2022/05/22
4.5K2
php – 通过curl从url获取JSON数据「建议收藏」
我试图通过curl连接从URL获取JSON数据.当我打开链接时:它显示{“version”:“N / A”,“success”:true,“status”:true}. 现在,我希望获得以上内容.
全栈程序员站长
2022/07/11
4K0
python flask里 post请求,JSON数据获取方式总结
#!flask/bin/python #encodig=utf-8 # _*_ coding:utf-8 _*_ # Writer : byz # dateTime : 2016-08-05 from flask import Flask, jsonify, request, abort import json app = Flask(__name__) @app.route('/ana', methods=['GET', 'POST']) def call_analysis(): print
用户1214487
2018/04/16
8.6K0
map怎么转json对象_json怎么获取map
JSON 对象保存在大括号内。就像在JavaScript中, 对象可以保存多个 键/值 对。Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值) 都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。
全栈程序员站长
2022/09/23
3.5K0
java后台设计简单的json数据接口,设置可跨域访问,前端ajax获取json数据
在开发的过程中,有时候我们需要设计一个数据接口。有时候呢,数据接口和Web服务器又不在一起,所以就有跨域访问的问题。 第一步:简单的设计一个数据接口。 数据接口,听起来高大上,其实呢就是一个简单的Serlvlet,在有get的请求的时候,返回我们要提供的数据就可以。现在JSON数据格式已经很普遍,因为很方便,所以我们做一个json数据的接口。直接看代码 先建立一个实体类,就是包装我们的数据的 bean/kapian.java package bean; public class kapian { /
ShenduCC
2018/04/27
3.7K0
java后台设计简单的json数据接口,设置可跨域访问,前端ajax获取json数据
vmware workstation无法获取IP
有时在安装好虚拟机后,dhclient会发现无法获取IP地址 原因,有可能是连接网络模式的冲突——>个人推测 解决办法: 这时候只需删除桥接模式和仅主机模式,只留下NAT模式 这时候在
运维小白
2018/02/06
2.5K0
vmware workstation无法获取IP
虚拟机无法联网 无法自动获取IP
突然有一天开发无法连接上虚拟机了,打开虚拟机先是发现无法联网,后来ifconfig连IP都没有了,只有一个127.0.0.1
叶茂林
2023/09/02
3310
点击加载更多

相似问题

JSON无法获取数据

22

无法获取json数据

22

无法从json获取数据

10

无法获取json对象数据

20

我无法获取JSON数据

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文