You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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"——这就能明显看出变量和对象属性的区别了。

二、为什么varlet声明的全局变量,与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

火山引擎 最新活动