一道关于this指向的js笔试题

var Test ={
  foo:"test",
  func:function () {
    var self=this;
    console.log(this.foo);
    console.log(self.foo);
    (function () {
      console.log(this.foo);
      console.log(self.foo);
    })();
  }
};
Test.func();

输出 test test undefined test

阅读 5k
5 个回答

this指针是执行其调用者,在执行Test.func(),后func的调用者是Test这个对象,所以func内部的this指针指向了Test,所以第一个this.foo和self.foo很好理解,需要注意的是self这里作为一个变量把this指针指向者也就是Test保存下来了,所以内部的函数闭包在执行的时候没有调用者,所以this指针指向了window对象,window对象没有foo这个变量,所以输出undefined,然后下面的self.foo访问了闭包外部的self变量也就是刚保存下来的Test对象;因此输出了test;

另外注意的是:如果一个函数是自身调用,没有其他的对象调用的话,在非严格模式下,this指针指向的是全局对象,也就是window对象,如果在严格模式下,this指针指向的是undefined,也就是说非严格模式下如果this指针指向了undefined,那么就会默认指向window对象;

稍微对你的题目变形一下

var foo = "global-foo";//全局变量
var Test ={
  foo:"test",
  func:function () {
    var self=this;
    console.log(this.foo);
    console.log(self.foo);
    (function () {
      console.log(this.foo);
      console.log(self.foo);
    })();
  }
};
Test.func();

clipboard.png

自执行函数里的this非严格模式下指向的是window,window没有foo属性当然undefined。所以把用self把this存下来(这题貌似看过好几遍了)=。=

在函数func()的执行环境中,调用者是Test,this指向Test,把当前的执行环境this 赋值 给 self,因此self此时和this相同.

所以输出的结果自然都是 this.foo = test

[回答不认真,先删掉。]

刚才犯了很低级的错误,sorry。

立即执行函数,并没有明确的指明调用对象,可以理解为执行的是window,因此this指向window。

    var foo = "window foo";
    var Test = {
        foo: "test",
        func: function () {
            var self = this;
            console.log(this.foo); // test
            console.log(self.foo); // test
            (function (name) {
                console.log(name.foo); // test 
                console.log(this);  // window
                console.log(this.foo); // window foo
                console.log(self.foo); // test
            })(this);
        }
    };
    Test.func();

this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的;
Test.func();这里是Test在调用,所以this指向它,所以前两个指的就是'test',
而下面的立即执行函数第一个this指的是它的上一级,这里没有定义foo,所以就是undefined
最后的self就是它的最外层的this

1、由new调用?->绑定到新创建的对象;
2、由call或者apply(或者bind)调用?->绑定到指定的对象;
3、由上下文对象调用?->绑定到那个上下文对象;
4、默认:在严格模式下绑定到undefined,否则绑定到全局对象。

请按照上面的顺序判断this的指向,至于那个self,使用的是词法作用域。

推荐问题