javascript中this的用法----个人见解

      this在javascript里面一直是让人比较纠结的一块,特别是混在在复杂对象、继承、函数里面,还有一些call、apply这些变态的函数,更是让人头疼不已。

      本文只是我个人对this的一些总结,分享给大家,只求你一看能有收获。具体内容可能有偏差,也可能比较肤浅,敬请大家留言交流指正。

      首先,我认为,理解js里面的this,首先是理解this这个东西。相信很很多人和我一样,只知道this这样用,那样用,却忽略了一个最基本的事实:this其实指的就是一个对象。一个对象的代名词,不是指一个字符串,也不是一个函数等等。仅仅是一个对象。

      基本含义:this 对象 返回“当前”对象。在不同的地方,this 代表不同的对象。也就是所谓的this所代表的对象要看实际运行时候的上下文环境。

      我今天也正好就单单从“this只是指向对象”这个思路来展开,下面通过几个简单例子来看一下几种情况,然后进行简单的分析:

  

e.g.1
 
      比如:var a=function(){
                  return this;
               }
               console.log(a()==window)         //true
       此时,a是一个全局的函数表达式,外面没有对象,所以其值默认就是最外面的window对象。页面里面所有的对象和内容都是window对象的子孙,所以上面的this指向值其实是window。
     
        从这个,可以总结:
           如果外部没有对象定义,this指向默认的window对象。
 
e.g.2
 
     再比如,var person={
             name:"张三",
             sayThis:function(){
                return this;
              }
          } 
     console.log(person.sayThis()==window)      //false
     console.log(person.sayThis()==person)         //true
 
     这次把相同的函数声明,放到一个对象里面,从测试结果可以看出,this此时已经不指向外侧的window了,已经指向定义其的外部对象了。这里就是person 
     从这个,可以总结:
           如果外部有对象定义,this指向其外部的对象。
 
e.g.3
 
    如果将此对象的内部方法赋予外部的其他对象呢,这样,this值指向什么呢
 
var person={
                   name:"123",
                 returnThis:function(){
                     return this;
                 }
             }
            var man={
                name:"456",
                getNowThis:this,
                sayThis1:person.returnThis(),
                sayThis2:person.returnThis
            }
 
           console.log(man.sayThis1);                        //person   这里在赋予sayThis1的值时候,returnThis方法已经运行,
                                                             //         this值已经确定, 指向returnThis所在的环境里面的this
          console.log(man.sayThis2());             
                                                             //man      这里在赋予sayThis2的值时候 ,只是把returnThis所代表的
                                                              //         函数赋予给sayThis2,所以最后在运行man.sayThis2()函数的时候,
                                                             //        实际上运行的是return this,故this指向man

 //这里,主要把person对象returnThish和returnThish()分别赋予给man对象 

  


 从这个,可以总结:
           this值指向的对象确实如大家所说,看实际运行时候的环境变量。this值相应的也会有所改变。(这恐怕是js里面最让人费解又非常强大的功能之一了吧)
 
 
e.g.4
 
  数组里面有没有this指向呢?
             
 
 var arr=[
                
            function(){     return this;     } ,
             2,
             3,
             4           
       ]
     console.log(arr[1])              //2
     console.log(arr[0]())           // arr       得到的是这个数组,说明this指向的是这个数组本事
     arr[0]()==arr                   // true       证实了this等于这个数组
     arr[0]()[1]                      //2            this可以正常当做数组也使用

  

 由上面的例子可以看出,数组的this值也指向该this,我猜测了一下,得出下面的结论:
 
         数组也有this,因为数组本来就是object对象的一种。遵从于this指向对象的结论。(此处我不禁想,字符串等也是一种隐式声明的对象,有this值么。感兴趣的可以测试一下)
 
e.g.5
 
   在构造函数里面也会存在this
        
 function Person(){
      this.age=25;
      this.title="title";
       this.sayThis=function(){
          return this;
      }
   }
  var person1=new Person();
  Person.age                      // undefined
  person1.age                     //  25
  person1.sayThis() .title        //  "title"
  person1.sayThis()==Person       // fasle
  person1.sayThis()==person1      // true

  

     这里首先发现,函数里面的this并没有指向函数本身,也没有指向外面的window对象等。这里我想起来了书上说的这个过程,要理解这个this被赋值的过程,关键是注意那个new操作字符串。
   这种Person()其实是一种构造函数定义对象的方法。经历了四个步骤
       (1)、创建一个新对象
       (2)、将构造函数的作用域赋给新对象。(因此this就指向了这个新对象);
       (3)执行构造函数里面的代码(为这个新对象添加属性)
       (4)返回新对象。
     上面4条过程来源于javascript高级程序设计相关内容。
     
所以,由此我们看出,通过构造函数,person1对象被构造出来了,这种构造方法产生的this,其实最终也是指向对象的。不过过程比较隐蔽,通过结果也可以看出,最后this其实是指向了person1实例对象。
           
     从上面的例子,我简单得出了下面的结论:
 
              构造函数的this指向并不是构造函数本身,而是指向相应的实例对象,再次证明了this指向对象
 
     -----------------------------------------------------------------------------------------------------------------------------------------------
 
 
 总结上面:
      
      1、this指向的一定是一个对象。
      2、在外面没有对象时候,this指向默认的window对象
      3、外部有对象时候,this指向该对象
      4、对象调用其他对象的this,要看具体的this运行环境来决定this指向的是哪个对象。
      5、数组里面的this对象也会指向数组本身,数组也是对象的一种。
      6、构造函数里面的this对象,指向是实例对象本身,而不是构造函数。
 
 
     上面的几个例子仅仅是我的简单测试,希望通过这个角度对this有个更好的认识和了解。其实应该还有更多更复杂的用法,迫于现在还不是很熟悉,就先不献丑了。待日后补充。。。。
     如有错误,希望多多留言补充~
 
 
 
 
 
 
posted @ 2014-03-25 21:25  lwl_star  阅读(1216)  评论(0编辑  收藏  举报