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

函数创建的对象中let变量取值疑问:ans属性为何始终为初始值?

闭包对象中属性值的疑问解答

问题答案

  • 对象的ans属性确实是恒定的,始终等于调用createCounter时传入的初始init值
  • 当前的代码语法无法直接获取闭包内部ans的当前值,因为对象的ans属性只是创建对象那一刻的快照,和后续闭包变量的更新无关

原因解释

你写的代码里,返回对象时用的ans,是JavaScript的属性简写语法,等价于ans: ans。这里第二个ans是取创建对象瞬间局部变量ans的值(也就是初始的init),之后这个对象属性就固定下来了,和闭包里的ans变量彻底断开了关联。

而increment、decrement、reset这些方法是通过闭包访问的那个局部变量ans,它们修改和读取的都是闭包里的ans,所以调用myob1.increment()会让闭包里的ans变成4,但对象的ans属性还是当初的3。

解决方法:用getter属性获取当前值

如果想通过对象属性直接拿到闭包内部ans的最新值,可以把对象的ans改成getter属性:

let createCounter = function(init) {
    let ans = init
    return {
        increment(){return ++ans},
        decrement(){return --ans},
        reset(){return ans = init},
        get ans() { return ans }, // 每次访问myobj.ans都会执行这个函数,返回当前闭包的ans值
    }
};

测试示例:

myob1=createCounter(3)
myob1.increment() // 4
console.log(myob1.ans) // 4,现在能拿到最新值了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:07:05