1. 总体规律

(1)看函数执行时,是否通过对象来调用这个函数,有则 this 指向这个对象,没有通过任何对象调用,就是通过 window 调用

  1. function f() {
  2. console.log(this);
  3. }
  4. var obj = {fn: f};
  5. obj.fn(); //=> {fn: f},输出的是 obj
  6. f(); //=> window

(2)自执行函数的 this 是指向 window,因为它是自己执行的,没有通过任何对象。

  1. (function() {
  2. console.log(this); //=> window
  3. })();

(3)回调函数中的 this 指向 window,因为其本身也没有通过任何对象调用

  1. arr.sort(function () {
  2. console.log(this); //=> window
  3. })

(4)DOM 事件绑定的 this 指向绑定的 DOM 元素

  1. div1.onclick = function() {
  2. console.log(this); //=> div1
  3. }

2. 闭包中的 this

  1. var name = 'The Window';
  2. var obj = {
  3. name = 'The Object',
  4. getName: function() {
  5. console.log(this.name);
  6. return function() {
  7. console.log(this.name);
  8. }
  9. }
  10. }
  11. obj.getName()(); //=> The Object The Window,实际上 getName 是通过 obj 调用的,而返回的函数是在全局调用的

3. 练习

题目一:

  1. var num = 1;
  2. var obj = {
  3. num: 10,
  4. fn: (function() {
  5. this.num *= 3; //=> 自执行函数 this 指向 window
  6. return function() {
  7. num += 2;
  8. this.num++;
  9. }
  10. })()
  11. }
  12. var f = obj.fn; //=> this 指向 window,此时 num = 3
  13. f(); //=> this 指向 window,此时 num = 6
  14. obj.fn(); //=> this 指向 obj,此时 num = 8, obj.num = 11
  15. console.log(num, obj.num); //=> 8 11

题目二:

  1. var name = 'aa';
  2. var age = 9;
  3. age = (function(name, age) {
  4. name = 'aa';
  5. age = age || this.age;
  6. this.age = arguments[0];
  7. console.log(name, age); //=> 'aa', 9
  8. return this.age;
  9. })(name, age);
  10. console.log(name, age); //=> 'aa', 'aa'

题目三:

  1. var obj = {name:'aa',age:9};
  2. (function (obj) {
  3. obj.name = 'bb';
  4. obj = {};
  5. obj.age = 5000;
  6. console.log(obj.age); //=> 5000
  7. })(obj);
  8. console.log(obj.name); //=> 'bb'

题目四:

  1. var num = 1;
  2. var obj = {num: 2};
  3. obj.fn = (function(num){
  4. this.num = num * 2;//=> this 指向 window,num 指 obj.num
  5. num++;
  6. return function(n) {
  7. this.num += n;
  8. num++; //=> num 是自执行函数中的 num
  9. console.log(num);
  10. }
  11. })(obj.num);
  12. var fn = obj.fn; //=> window.num: 4, obj.num: 2, num: 3
  13. fn(10); //=> window.num: 14, obj.num: 2, num: 4,输出 4
  14. obj.fn(20); //=> window.num: 14, obj.num: 22,num: 5,输出 5
  15. console.log(num, obj.num) //=> 14, 22