JavaScript中Child子类的上层作用域是父类还是全局作用域?
问题解答
核心结论
- Child 类的上层作用域是全局作用域,你最初的判断完全正确。
- 你的认知误区是把 词法作用域规则 和 原型链继承规则 混为一谈,二者是完全独立的两套运行机制,没有关联。
详细说明
词法作用域的判定逻辑
词法作用域只看代码的书写位置,和运行时的调用、继承关系没有任何关系:
你给出的代码中,class Child 的定义直接写在全局上下文里,没有嵌套在 Parent 类的花括号作用域内部,所以它的上层作用域自然是全局。你写 extends Parent 时,JS 查找 Parent 标识符的路径就是:先查 Child 类定义的块作用域→没找到就去上层的全局作用域找,完全符合词法作用域的规则。
你可以用下面的反例验证:
function wrap() { class Parent { constructor(name){ this.name = name } } } wrap() // 此处会抛出 ReferenceError,因为全局作用域下不存在 Parent 标识符 class Child extends Parent {}
原型链和作用域的区别
你误以为作用域和原型链相关,本质是搞混了两套不同的查找规则:
- 作用域管的是标识符(变量名、类名、函数名等)的查找逻辑,决定你写的某个名称在当前位置能不能被访问到。
- 原型链管的是对象属性的查找逻辑,只在你访问某个对象的属性时生效,比如你创建 Child 实例
const ins = new Child('a'),访问ins.name时,会先找实例自身的属性→找不到去Child.prototype找→找不到去Parent.prototype找,这套逻辑和作用域没有任何关系,也不会影响作用域的判定。
内容的提问来源于stack exchange,提问作者jojokiki
相关产品推荐
相关产品推荐

