this的指向问题
- 若果一个函数中有this,但是它没有被上级对象所调用,那么this的指向是window
(在js不是严格型的情况下) - 若一个函数中有this,这个函数有被上一 级对象所调用,那么this的指向就是上一级
对象 - 若一个函数中有this,这个函数中包含多个对象,尽管这个函数是被外层的对象所调用,this的指向也只是它上一级的对象。
知识点补充:
在严格版中的默认的this不再是window,而是undefined。
new操作符会改变函数this的指向问题,虽然我们上面讲解过了,但是并没有深入的讨论这个问题,网上也很少说,所以在这里有必要说一下。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132//this最终指向的是调用它的对象function a(){var user="陈";console.log(this.user);//undefindedconsole.log(this);//window}a();//window对象在调用他//证明上述观点function a(){var user="陈";console.log(this.user);//undefinedconsole.log(this);//window}window.a();//this的指向在函数创建的时候是决定不了的,在调用的时候才能决定var o={user:"陈",fn:function(){console.log(this.user);}}o.fn();//陈//与上面例子作比较var o={user:"陈",fn:function(){console.log(this.user);}}window.o.fn();//陈//this对象的指向问题var o={a:10,b:{a:12,fn:function(){console.log(this.a);//12}}}o.b.fn();//直接调用它的内层对象var o={a:10,b:{//a:12,fn:function(){console.log(this.a);}}}o.b.fn();//undefined//特殊情况var o={a:10,b:{a:12,fn:function(){console.log(this.a);//undefinedconsole.log(this);//window}}}var j=o.b.fn;j();//注意this的指向是最后调用它的 对象,也就是看它执行的时候是谁调用的//证明上述观点var o={a:10,b:{a:12,fn:function(){console.log(this.a);//undefinedconsole.log(this);//window}}}var j=o.b.fn;window.j();//构造函数版的thisfunction Fn(){this.user="陈";}var a=new Fn();//a是new出来的一个对象实例console.log(a.user);//陈//当this碰到return的时候function fn(){this.user="陈";return {};}var a=new fn;console.log(a.user);//undefined//再看一个function fn(){this.user='陈';return function(){};}var a=new fn;console.log(a.user);//undefined//返回数字function fn(){this.user = '追';return 1;}var a = new fn;console.log(a.user); //追//返回undefinedfunction fn(){this.user = '追';return undefined;}var a = new fn;console.log(a.user); //追// 如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。//还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,//因为null比较特殊function fn(){this.user = '追';return null;}var a = new fn;console.log(a.user); //追