1. 总体规律
(1)看函数执行时,是否通过对象来调用这个函数,有则 this
指向这个对象,没有通过任何对象调用,就是通过 window
调用
function f() {
console.log(this);
}
var obj = {fn: f};
obj.fn(); //=> {fn: f},输出的是 obj
f(); //=> window
(2)自执行函数的 this
是指向 window
,因为它是自己执行的,没有通过任何对象。
(function() {
console.log(this); //=> window
})();
(3)回调函数中的 this
指向 window
,因为其本身也没有通过任何对象调用
arr.sort(function () {
console.log(this); //=> window
})
(4)DOM 事件绑定的 this 指向绑定的 DOM 元素
div1.onclick = function() {
console.log(this); //=> div1
}
2. 闭包中的 this
var name = 'The Window';
var obj = {
name = 'The Object',
getName: function() {
console.log(this.name);
return function() {
console.log(this.name);
}
}
}
obj.getName()(); //=> The Object The Window,实际上 getName 是通过 obj 调用的,而返回的函数是在全局调用的
3. 练习
题目一:
var num = 1;
var obj = {
num: 10,
fn: (function() {
this.num *= 3; //=> 自执行函数 this 指向 window
return function() {
num += 2;
this.num++;
}
})()
}
var f = obj.fn; //=> this 指向 window,此时 num = 3
f(); //=> this 指向 window,此时 num = 6
obj.fn(); //=> this 指向 obj,此时 num = 8, obj.num = 11
console.log(num, obj.num); //=> 8 11
题目二:
var name = 'aa';
var age = 9;
age = (function(name, age) {
name = 'aa';
age = age || this.age;
this.age = arguments[0];
console.log(name, age); //=> 'aa', 9
return this.age;
})(name, age);
console.log(name, age); //=> 'aa', 'aa'
题目三:
var obj = {name:'aa',age:9};
(function (obj) {
obj.name = 'bb';
obj = {};
obj.age = 5000;
console.log(obj.age); //=> 5000
})(obj);
console.log(obj.name); //=> 'bb'
题目四:
var num = 1;
var obj = {num: 2};
obj.fn = (function(num){
this.num = num * 2;//=> this 指向 window,num 指 obj.num
num++;
return function(n) {
this.num += n;
num++; //=> num 是自执行函数中的 num
console.log(num);
}
})(obj.num);
var fn = obj.fn; //=> window.num: 4, obj.num: 2, num: 3
fn(10); //=> window.num: 14, obj.num: 2, num: 4,输出 4
obj.fn(20); //=> window.num: 14, obj.num: 22,num: 5,输出 5
console.log(num, obj.num) //=> 14, 22