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

javascript中的这个上下文错误-为什么';这不会触发一个错误吗?,javascript,Javascript,我以为这会在使用关键字this从函数中调用函数时触发错误。运行Chrome37.0 S = function () { this.x = "test"; this.test1 = function () { console.log("test1"); this.test2(); }; this.test2 = function () { console.log(this); // output is s object

我以为这会在使用关键字this从函数中调用函数时触发错误。运行Chrome37.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();

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

因此,您的代码:

s.test1();
…将调用
test1
设置
等于
s
引用的对象,因为该调用是从对象
s
引用的属性获取
test1
函数引用的表达式的一部分

然后在
test1
中,执行以下操作时:

this.test2();
…它调用
test2
设置
this
等于
this
引用的对象,因为调用是从this引用的对象的属性获取
test2
函数引用的表达式的一部分

如果没有通过对象属性调用
test1
test2
,则会遇到设置不正确的
this
问题,如下所示:

var f = s.test1;
f();
然后,在对
test1
的调用中,
这个
将是全局对象(在松散模式下)或
未定义的
(在严格模式下)。将函数作为参数传递时也会发生同样的情况:

foo(s.test1);
如果
foo
调用它的第一个参数所涉及的函数,我们会得到相同的结果(
this
=全局对象或
undefined

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

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



更多关于此的信息,请点击这里,然后点击我的博客。

Bug?哪只虫子?为什么您认为它应该“触发一个bug”?将“this”更改为全局对象而不是实际对象。如果您调用
this.test2()
(作为一种方法!),为什么上下文会成为全局对象?关于“函数中的函数”的任何内容都不会隐式触发对
this
的更改。