JavaScript中Properties与Variables的区别及this、let/var相关疑问
关于JavaScript中this、变量与属性的疑问解答
嘿,你的观察特别细致,这些问题刚好戳中了JavaScript里作用域、对象属性和变量声明机制的核心要点,咱们一步步把它捋明白:
一、为什么getter函数里必须用this访问对象属性?
你的自我解释其实完全正确!咱们拆解一下:
- 对象字面量(比如
myObj)里的get name()函数,它的作用域是定义myObj的外部作用域(比如全局作用域),而不是myObj这个对象本身。所以如果你直接写_name,JavaScript会去外部作用域找这个变量,而不是myObj的属性。 - 而
this在getter函数中的指向是调用这个getter的对象(也就是myObj),所以this._name才能精准访问到对象自身的_name属性。 - 举个反例验证:如果全局作用域里也有个
let _name = "张三",那你在getter里直接写_name,返回的会是全局的"张三",而不是myObj的"Consala"——这就能明显看出变量和对象属性的区别了。
二、为什么var和let声明的全局变量,与this的关联不同?
这是ES5和ES6变量声明机制的差异导致的,在浏览器的全局环境下:
- 用
var声明的全局变量,会自动挂载到全局对象(window)上,成为它的属性。所以var test = "banana"等价于window.test = "banana",此时this.test(全局环境中this指向window)自然能拿到"banana"。 - 而
let(包括const)是ES6引入的新声明方式,它声明的全局变量不会挂载到全局对象上,而是存在于全局作用域的独立词法环境中。所以let test = "banana"时,test是全局变量,但不是window的属性,因此this.test会返回undefined;当你手动执行this.test = "apple",其实是给window对象新增了一个test属性,这时候自然能访问到它。
另外你提到的var的函数作用域特性,和这个机制是相关的:var没有块级作用域,全局的var变量直接成为全局对象的属性,而函数内的var变量则是函数作用域的局部变量,不会污染全局对象。
内容的提问来源于stack exchange,提问作者Sid Turner




