var number = 5; var obj = { number: 3, fn1: (function () { // 立即执行函数,会马上调用 var number; // 声明一个number,值为undefined this.number *= 2; // 由于函数被立即调用且是匿名函数,此时this指向window,全局number = 10 console.log(this) //window number = number * 2; //匿名函数内number此时为undefined number = 3; //匿名函数内赋值为3 return function () { // 返回一个函数 var num = this.number; console.log(this) //根据调用者来判定指向 this.number *= 2; console.log(num); number *= 3; //通过作用域链查找 console.log(number); } })() } var fn1 = obj.fn1; fn1.call(null); // 10 9 obj.fn1(); // 3,27 console.log(window.number);//20
刚开始有点懵,但一步步理解之后,豁然开朗