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

4

我已经开始尝试用一些更高级的概念来填补我的JavaScript知识空白。

我认为我基本上理解了作用域的工作方式。对象从原型和全局作用域继承,而函数在自身内部提供更传统的块级作用域。

我现在遇到困难的是:

function a(){
  console.log(this.z);
  }

a.z = 12;

a(); //returns undefined :(

我希望输出 12,但是实际结果不是。请问变量z被存储在哪里?例子中的"this"指的是什么?


A(); 将忽略 z 的设置。你可以这样做:a = new a(); 然后 a.z = 12; - pascalvgemert
this通常指函数对象(与函数作用域无关!),而是指函数的“上下文”。 - user2864740
请参见https://dev59.com/zHA75IYBdhLWcg3wv70j。 - user2864740
1个回答

2
当你调用一个函数时,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


灯泡亮了。现在我看到的许多代码模式都有意义了。谢谢。 - Greg G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接