Javascript函数范围与对象范围

时间:2014-05-12 06:17:18

标签: javascript scope

我已经达到了这样的程度,我试图通过一些更有希望的概念来填写我的javascript知识。

我想我非常了解范围如何运作。对象继承自原型然后继承全局范围,而函数本身提供了更传统的块范围。

我无法理解的是:

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

a.z = 12;

a(); //returns undefined :(

我期待回应12,但当然,事实并非如此。 z存储在哪里? “this”在示例中引用了什么?

1 个答案:

答案 0 :(得分:1)

当您调用函数时,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