You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6解构赋值失效求助:Canvas绘图功能实现时遇异常

解决Canvas绘图中ES6解构赋值失效的问题

嘿,这个坑我之前也踩过!你的解构赋值语句之所以不工作,完全是**JavaScript自动分号插入(ASI)**在搞鬼。

看你代码里的这段:

ctx.stroke()
//[TODO] destruction doesn't work????
[lastX, lastY] = [ev.offsetX, ev.offsetY]

因为ctx.stroke()后面没有加分号,JavaScript会自动尝试把它和下一行的解构语句合并解析,最终变成了这样的错误逻辑:

ctx.stroke()[lastX, lastY] = [ev.offsetX, ev.offsetY]

这显然不是你想要的写法,自然就导致解构赋值失效,甚至可能在控制台抛出语法错误。

两种快速修复方案:

  • 给前面的ctx.stroke()加上分号,明确分割两条语句:
    ctx.stroke();
    [lastX, lastY] = [ev.offsetX, ev.offsetY]
    
  • 在解构语句开头加个分号(强制和前面的代码切割开):
    ctx.stroke()
    ;[lastX, lastY] = [ev.offsetX, ev.offsetY]
    

而你用直接赋值lastX = ev.offsetX、lastY = ev.offsetY能正常运行,是因为这种赋值语句的语法不会被前面的函数调用语句干扰,JavaScript能正确识别这是两条独立的语句。

修改后你的完整draw函数示例:

let isDrawing = false
let lastX = 0
let lastY = 0
const draw = function(ev){
    console.log('isDrawing', isDrawing)
    if(!isDrawing){
        return
    }
    ctx.beginPath()
    ctx.moveTo(lastX, lastY)
    ctx.lineTo(ev.offsetX, ev.offsetY)
    ctx.stroke(); // 加上分号解决ASI问题
    [lastX, lastY] = [ev.offsetX, ev.offsetY]
}
canvas.addEventListener('mousemove', draw)
canvas.addEventListener('mousedown', (e) => {
    isDrawing = true
    [lastX, lastY] = [e.offsetX, e.offsetY]
})
// 记得补充mouseup和mouseleave事件停止绘图
canvas.addEventListener('mouseup', () => isDrawing = false)
canvas.addEventListener('mouseleave', () => isDrawing = false)

内容的提问来源于stack exchange,提问作者Pastilhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:47