刷到某公司的前端测试题:
var foo="global";
var test={
foo:"inner",
get:function(){
var self=this;
console.log(this);
console.log(this.foo);
console.log(self.foo);
(function(){
console.log(this.foo);
console.log(self.foo);
console.log(this);
})();
}
};
针对图示代码执行:test.get(),结果如上。
解析:这个问题的关键是方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象);
- get方法是由test对象调用的,this指向 test。第一个输出的this是test对象;
- this.foo输出inner,即test对象的属性foo的值
- self.foo输出inner,因为self是test对象的this的副本,指向test对象。
- 这个立即执行匿名函数表达式(IIFE)是由window调用的,this指向 window 对象。因此this.foo输出全局变量foo的值。
- IIFE的作用域处于test对象的作用域中,本作用域找不到self变量,沿着作用域链向上查找self变量,找到了指向test对象的 self。
- IIFE中的this即为window对象。