javascript中的这个上下文错误 - 为什么这不会触发错误?

时间:2015-01-29 18:27:33

标签: javascript

我认为这是假设在使用关键字this从函数内调用函数时触发错误。运行Chrome 37.0

S = function () {
    this.x = "test";
    this.test1 = function () {
        console.log("test1");
        this.test2();
    };
    this.test2 = function () {
        console.log(this); // output is s object, thought 'this' suppose to be global?
        console.log("test2");
    };
};
s = new S();
s.test1();

编辑:

我把它与这段代码混在一起:

   s = function () {
            console.log(this);
            var t = function () {

                console.log(this);
            };
           t();


    };
  x = new s();

1 个答案:

答案 0 :(得分:1)

将函数作为表达式的一部分调用,从对象属性获取函数引用,将函数调用this设置为您获取属性的对象。

所以你的代码:

s.test1();

...将调用test1设置this等于s引用的对象,因为该调用是表达式的一部分,从{a}}获取test1函数引用对象s上的属性是指。

然后在test1,当你这样做时:

this.test2();

...它调用test2设置this等于this引用的对象,因为调用是从{a}获取test2函数引用的表达式的一部分对象this上的属性是指。

如果没有 通过对象调用thistest1,那么test2未正确设置会遇到问题财产,像这样:

var f = s.test1;
f();

然后,在test1的调用中,this将是全局对象(在松散模式下)或undefined(在严格模式下)。将函数作为参数传递时会发生同样的事情:

foo(s.test1);

如果foo调用与其第一个参数相关的函数,我们得到相同的东西(this =全局对象或undefined)。

既然你没有这样做,那就不会发生。

这里的关键是如何调用函数,而不是它定义的位置(在另一个函数内部)。


有关How Does The this Keyword Work?this的详情,请点击此处,以及我博客上的Mythical methodsYou must remember this