1. 总体规律
(1)看函数执行时,是否通过对象来调用这个函数,有则 this 指向这个对象,没有通过任何对象调用,就是通过 window 调用
function f() {console.log(this);}var obj = {fn: f};obj.fn(); //=> {fn: f},输出的是 objf(); //=> 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 指向 windowreturn function() {num += 2;this.num++;}})()}var f = obj.fn; //=> this 指向 window,此时 num = 3f(); //=> this 指向 window,此时 num = 6obj.fn(); //=> this 指向 obj,此时 num = 8, obj.num = 11console.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', 9return 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.numnum++;return function(n) {this.num += n;num++; //=> num 是自执行函数中的 numconsole.log(num);}})(obj.num);var fn = obj.fn; //=> window.num: 4, obj.num: 2, num: 3fn(10); //=> window.num: 14, obj.num: 2, num: 4,输出 4obj.fn(20); //=> window.num: 14, obj.num: 22,num: 5,输出 5console.log(num, obj.num) //=> 14, 22
