this指向问题
1 // 考察:this指向 2 // 自执行函数有参数传递 3 var num = 10; //全局作用域的num=10 4 var obj = { 5 num: 40, //对象obj中的num=20 6 fn: (function (num) { //自执行函数,函数参数值传递,传入的参数num为全局作用域中的num=10的副本 7 this.num *= 2; //全局变量num,window.num*=2 全局的num变成20 8 alert(this.num); //20 9 num += 100; //这里的num为自执行函数传入的参数,10+100=110,num=110 10 alert(num); //110 11 return function () { //这里形成闭包 this根据调用函数对象确定 12 alert(this); //(fn()执行时this指向window, obj.fn()执行时this指向obj) 13 this.num *= 3; // this.num 14 num += 1; // 上级函数作用域中的num 15 console.log(num); 16 console.log(this.num); 17 } 18 })(num) //参数,值传递,传入的参数为全局作用域中的num=10 19 }; 20 var fn = obj.fn; //把obj.fn赋值给fn 21 fn(); //这里执行的程序是obj对象fn方法 this->window //111 60 22 obj.fn(); //这里也是执行obj对象fn方法,this->obj //112 120 23 console.log(window.num); //60 24 console.log(obj.num); //120 25 console.log(this.num); //60 this->window
1 // 考察:this指向 2 // 自执行函数无参数传递 3 var num = 1; //全局作用域的num=1 4 var obj = { 5 num: 2, //对象obj中的num=2 6 fn: (function(){ //自执行函数 7 this.num += 10; //全局变量num,this->window, window.num*=2 全局的num变成20 8 num = num + 10; //这里的 num 虽然在下面声明了,但却没有初始化,因此执行完后是NaN 9 var num = 3; //变量提升,在这里赋值为3 10 return function(){ //这里形成闭包 this根据调用函数对象确定 11 //(fn()执行时this指向window, obj.fn()执行时this指向obj) 12 this.num += 10; 13 num++; //上级函数作用域中的num(num=3) 14 console.log(num); 15 console.log(this.num); 16 } 17 })() 18 }; 19 var fn = obj.fn; 20 21 fn(); //结果为4 21 22 obj.fn(); //结果为5 12 23 console.log(num); //结果为21 24 console.log(obj.num);//结果为12
参考:http://www.imooc.com/qadetail/161604?t=227246