谁调用,指向谁?
在哪个作用域下执行this就是指向哪个对象!
<script>
console.log(this); //window (全局this指window)
var age = 10;
function foo () {console.log(this.age);}
foo(); //10 (window对象调用foo函数,this指window)
var obj1 = {"age" : 20,"foo" : foo}
obj1.foo(); //20 (obj1对象调用foo函数,this指obj1)
var obj2 = {"age" : 30}
(obj2.foo = obj1.foo)(); //10 (IIFE,window立即调用foo函数,this指window)
obj2.foo(); //30 (obj2调用foo函数,this指obj2)
setTimeout(function () {
console.log(this.age); //10 (setInterval()/setTimeout()相当于window.setInterval()/window.setTimeout(),window调用)
}, 1000);
var obj3 = {
age : 40,
foo : function () {
(function () {console.log(this.age);})();//10 (IIFE,window对象立即调用foo函数,this指window)
setTimeout(function () {
console.log(this.age); //10 (setInterval()/setTimeout()相当于window.setInterval()/window.setTimeout(),还是window调用)
}, 1000);
}
}
obj3.foo(); //10 (虽然是obj3调用,但是存在IIFE,window对象立即调用foo函数,this指window)
var obj4 = {
age : 60,
foo : function(){return function(){console.log(this.age)};}
};
obj4.foo()(); //10 (obj4.foo()返回了一个匿名函数,然后调用执行这个匿名函数。因为这个匿名函数不是作为某个对象的方法来调用执行,所以它的this就是指向wlndow对象)
</script>
总结:
1、全局this指window;
2、构造函数里的this指即将new的那个对象;
3、对象方法的this指向对象本身;
4、IIFE(立即执行函数表达式) this指window;
5、事件里的this指事件触发对象;
6、箭头函数没有自己的this;
7、定时器里的this指window;
8、匿名函数的执行环境具有全局性,匿名函数里的this指window;