为何JavaScript对象不创建词法作用域?箭头函数this指向疑问
编辑补充:我清楚普通函数与箭头函数的区别,这是针对箭头函数因词法作用域在对象中失效的具体疑问,我认为这不是重复问题。
JavaScript对象不创建独立词法作用域,核心是语言设计层面的逻辑一致性与复杂度权衡:
词法作用域的载体是执行上下文单元:词法作用域是基于代码书写位置划分的变量访问范围,只有函数、ES6+的块级代码(
{}包裹的语句)这类执行上下文载体才会生成词法作用域。对象字面量本质是数据结构定义,只是存储键值对的容器,不属于执行上下文范畴,自然不需要独立的词法作用域。避免作用域嵌套的复杂度失控:如果每个对象都生成词法作用域,嵌套对象会形成层层嵌套的作用域链,大幅提升JS引擎的执行成本,同时让变量查找逻辑变得混乱。比如多层嵌套对象中,内层属性访问外层对象变量时,作用域链的查找路径会变得难以预测,违背JS“简洁易用”的设计初衷。
this绑定与词法作用域的职责分离:JS中普通函数的this绑定基于调用方式,而非词法作用域。用person.print()调用普通函数时,this指向person是因为“函数作为对象方法被调用”这个行为,和对象有没有词法作用域无关。而箭头函数的this继承自定义时的外层词法作用域,由于对象没有自己的词法作用域,箭头函数的this就会落到外层作用域(比如严格模式下全局作用域的this为undefined)。历史设计的延续性:JS最初借鉴了Scheme的词法作用域和Self的原型链机制,但为贴近Java等主流语言的使用习惯,将
this绑定逻辑与作用域规则做了分离。不给对象赋予创建作用域的能力,是为了让作用域规则和this绑定逻辑保持清晰,降低开发者的理解门槛。
内容的提问来源于stack exchange,提问作者kakacii

