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

JS对象初始化时访问自身属性报错,求解决方案及原理解析

问题解决与技术原理解析

错误根源

错误出在代码第5行:y: canvas.height-mario.h。在创建mario对象的过程中,你试图访问还未完成初始化的mario变量,而let声明的变量存在暂时性死区(TDZ),在变量完成初始化前无法被访问,因此抛出ReferenceError。

修复方案

提供两种可行的修复方式:

方式一:提前提取属性值

先单独定义高度变量,再在对象中复用该变量:

const marioHeight = 40;
let mario = {
    x: 20,
    w: 20,
    h: marioHeight, 
    y: canvas.height - marioHeight, 
    speedX: 0,
    speedY: 10,
    dx: 4,
    dy: -7,
    color: "black",
    canJump: true,
    onGround: true,
}

export default mario

方式二:初始化后补设属性

先完成对象初始化,再单独设置y属性:

let mario = {
    x: 20,
    w: 20,
    h: 40, 
    speedX: 0,
    speedY: 10,
    dx: 4,
    dy: -7,
    color: "black",
    canJump: true,
    onGround: true,
}

mario.y = canvas.height - mario.h;

export default mario

技术原理详解

  • 暂时性死区(Temporal Dead Zone, TDZ):使用let/const声明的变量,从当前作用域起始位置到变量完成赋值的这段区间,变量处于不可访问的状态。
  • 对象字面量的属性计算是在变量赋值完成前执行的,此时mario还处于TDZ中,无法被引用。如果用var声明变量不会触发这个错误(因为var存在变量提升),但var的变量提升会带来其他潜在问题,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:22:15