Javascript函数作用域vs对象作用域

Javascript Function Scope vs Object Scope

本文关键字:作用域 对象 vs Javascript 函数      更新时间:2023-09-26

我已经到了我试图用一些更高级的概念来充实我的javascript知识的地步。

我想我非常了解作用域是如何工作的。对象继承原型,然后是全局作用域,而函数在自身内部提供更传统的块作用域。

我不能理解的是:

function a(){
  console.log(this.z);
  }
a.z = 12;
a(); //returns undefined :(

我期望返回12,但是当然,它没有。z究竟存储在哪里?这个例子中的"this"指的是什么?

当你调用一个函数时,JavaScript会将当前上下文(this)设置为调用它的对象。如果函数没有附加到任何对象,默认情况下将使用全局对象(浏览器中的window对象)*

因此,在这种情况下,this指的是全局对象,而不是a。在全局对象中,z还没有定义。这就是为什么它返回undefined

要获取值12,需要像这样访问

function a() {
    console.log(a.z);   // Use `a` itself, instead of `this`.
}
a.z = 12;
a();

*在严格模式下,如果在没有任何显式对象引用的情况下调用函数,this将被设置为undefined