JavaScript这是指窗口而不是函数内的对象

时间:2013-04-05 10:25:09

标签: javascript this

我对JavaScript this参考情况感到困惑。

我正在研究一个在对象方法中声明函数的代码。 (原因是整理对象方法中的代码,同时保持函数对方法是私有的。)

以下是重新解决问题的实验。

我发现this内的greeting函数指的是窗口范围,而不是 person 范围。

var person = {
    nickname: "Makzan",
    sayHi: function() {
        console.log(this);
        var greeting = function() {
            console.log(this);
            return "Aloha " + this.nickname;
        }
        console.log(greeting());
    }
}
person.sayHi();

(jsfiddle中的相同代码:http://jsfiddle.net/makzan/z5Zmm/

这是浏览器中的日志结果:

> Object
> Window
Aloha undefined 

在JS中,我知道这个引用很棘手。我可以使用.call方法更改范围,以使此代码有效。

var greeting = (function() {
    console.log(this);
    return "Aloha " + this.nickname;
}).call(this);

但是,我很想知道为什么默认情况下this引用问候语方法中的 window 范围?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

this范围无关。它由 context 决定。

greeting()调用没有上下文的函数,因此this是默认对象(浏览器中为window)。

答案 1 :(得分:4)

this,引用与范围无关,它取决于调用上下文。

根据MDN doc

  

通常,在当前范围内绑定到此对象的对象是   由当前函数的调用方式决定

答案 2 :(得分:2)

尝试person.nickname,这是指您案例中的var问候语