提问人:jc0022 提问时间:2/19/2023 最后编辑:jc0022 更新时间:2/19/2023 访问量:48
JavaScript 函数调用上下文具有有效参数,但函数无法获取它们
JavaScript function call context has valid parameters, but function doesn't get them
问:
在使用回调的自定义事件处理设置中,回调的调用上下文显示回调参数的有效值,但在单步执行函数后,参数值未定义。
如果重要的话,这是在使用 React 的 Electron 渲染器进程内部。
在普通 JavaScript 对象中,调试器显示回调报告行上所有内容的预期上下文值。SerialPortEvent.Opened
// file: serialPort.js (no imports)
class SerialPortEvent {
Discovered = 0
Opened = 1
Closed = 2
DataReceived = 3
Error = 4
}
class SerialPortSpec {
...
addEventListener(listener) {
this.listeners.push(listener)
}
open(baudRate) {
const baudRateInt = parseInt(baudRate, 10)
window.serialport.open(this.portInfo.path, baudRateInt)
.then(binding => {
this.baudRate = baudRateInt
this.binding = binding
// Here, the debugger shows all locals are as expected
this.listeners.forEach(listener => listener(SerialPortEvent.Opened))
}).catch(reason => {
this.listeners.forEach(listener => listener(SerialPortEvent.Error, reason))
})
}
...
}
...
module.exports = { SerialPortEventHub, SerialPortSpec, SerialPortEvent }
但是,在回调函数“portEventHandler”的开头,一个“单步执行”之后,参数值为 。我很想知道为什么!谢谢。undefined
// file SerialPortUI.jsx
import React from 'react'
import { SerialPortEventHub, SerialPortEvent, SerialPortSpec } from './serialPort'
import './serialportui.css'
class SerialPortPanel extends React.Component {
...
portEventHandler(eventType, ...data) {
// Here, eventType is undefined. This file does import SerialPortEvent.
switch (eventType) {
...
}
}
...
}
答:
1赞
Bergi
2/19/2023
#1
class SerialPortEvent { Discovered = 0 Opened = 1 Closed = 2 DataReceived = 3 Error = 4 }
这不是一个正确的枚举声明。类字段将在实例上创建,您在代码中访问的静态类属性确实是 。这就是被调用函数接收到的值。SerialPortEvent.Opened
undefined
相反,您需要使用具有属性的对象:
const SerialPortEvent = {
Discovered: 0,
Opened: 1,
Closed: 2,
DataReceived: 3,
Error: 4,
};
如果你从不实例化语法,就永远不要使用语法(使用)!class
new
评论
0赞
adsy
2/19/2023
他也可以在 TS 中使用,这几乎是唯一在 TS 中具有运行时的东西enum
0赞
Bergi
2/19/2023
@adsy 是的,我原本打算在评论中提出可能混淆的建议,但这个问题没有用 TypeScript 标记class
enum
0赞
adsy
2/20/2023
啊,是的,没错,出于某种原因,当那里没有 TS 时,我的大脑将其解析为 TS。
评论
addEventListener