对象的词法作用域(LE)是什么?附代码示例相关疑问
关于词法作用域与对象成员的疑问解答
先澄清一个核心点:词法环境(LE)是和执行上下文绑定的概念,只针对函数、全局代码块这类可执行的代码单元,对象本身没有自己的词法环境。
针对你的两个疑问:
对象
stacy没有词法环境
你提到的stacy是在全局执行上下文中创建的一个对象,变量stacy本身属于全局词法环境,但对象的属性(比如name、sayName)只是对象的成员,和词法环境无关。对象不是可执行的代码块,不存在自己的词法环境。sayName()的词法环境是全局词法环境sayName函数是在全局作用域下定义的(哪怕它是作为对象属性被赋值的),所以它的词法环境就是创建它的全局词法环境。
至于为什么省略this后找不到name:
- 当你写
console.log(name)时,JS会沿着作用域链查找名为name的变量,但全局作用域里没有声明过name变量,自然找不到。 - 而
this.name里的name是对象的属性,不是变量,属性的查找是基于this指向的对象(这里stacy.sayName()调用时this指向stacy),和词法作用域的变量查找完全是两套逻辑。简单说:词法作用管的是“变量在哪定义的”,对象属性管的是“这个对象有没有这个属性”,两者不互通。
举个例子就能看清楚区别:
var name = "全局变量name"; var stacy = { name: 'stacy', age: 33, sayName: function() { console.log(name); // 这里会输出"全局变量name",因为找到的是全局变量 } } stacy.sayName();
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

