JavaScript中对象是否可以访问外部Lexical Environment?
问题核心结论
你存在的认知误区是:负责绑定词法环境的是函数本身,而非承载函数的对象,你的代码能正常运行和返回的对象没有任何关系。
具体原理说明
up、down两个方法本质是counter函数执行过程中,在其内部创建的函数。所有JS函数在被创建时,就会捕获当前所处执行上下文的词法环境,并且永久持有这个引用,和后续函数被如何使用、挂载到哪个对象上没有关联。- 你代码中的
up、down创建时,所处的词法环境刚好包含count变量,所以无论之后是把它们作为对象属性返回,还是解构出来单独调用,都能正常访问到count变量。 - 对象本身确实不持有外部词法环境的引用,你观察到的访问能力完全来自函数自身持有的词法环境引用,和它是否是对象的属性无关。
验证示例
你可以用下面的代码验证这个逻辑,将up定义在counter外部时,就算挂载到返回的对象上,也无法访问到count:
// 函数在counter外部创建,无法捕获counter内部的词法环境 function up() { return ++count // 执行时会报count未定义错误 } function counter(start) { let count = start return { up } } const obj = counter(10) obj.up() // 报错
针对你疑问的直接回应
counter函数返回对象时,不会建立对象和对应词法环境的任何关联,up、down对count的访问能力在这两个函数被创建的那一刻就已经确定了。
内容的提问来源于stack exchange,提问作者MaHdi
相关产品推荐
相关产品推荐

