【javascript】javascript中this关键字的理解

this关键字 

每一个方法或函数都会有一个this对象,this对象是方法(或函数)在执行时的那个环境,也可以说是这个函数在那个作用域下运行的。 
说的更通俗一点:this就相当于咱们平时说话时候说的“我”,“我家”的概念。就是说当一个方法在运行的时候,它是属于谁的。它在运行的时候它的家是谁家。 
this的概念比较抽象,是讲课的时候的难点也是重点。 
关于this的具体表示那个对象,和函数的运行方式(或调用方式)有关。 

在JavaScript中一共有四种调用模式: 
方法调用模式(对象属性模式)、 
函数调用模式(就是普通的函数执行)、 
构造调用模式(应该叫实例上的方法模式更好) 
和apply调用模式。 


一、当它为一个对象上的方法的时候,this是当前这个对象  
方法调用模式(或称:对象属性模式) 
先了解一个概念:方法和函数的区别。方法和函数本质一样,形式不同而已。看下例: 
Js代码   收藏代码
  1. function fn(){  
  2.     alert(this)  
  3. }  

这样就是定义了一个函数,当:fn()的时候,叫这个函数运行。同样是上面这个fn函数,如果把它赋值给一个对象的属性,就成了方法了,看下面的例子。 
Js代码   收藏代码
  1. var obj=new Object();//先定义一个对象obj  
  2. obj.objFn=fn;  

那现在的obj.objFn就是方法了,但其实objFn和fn指向的是同一个内存地址。但fn是直接定义的,就是函数,而objFn是obj这个对象上的一个属性,则objFn就是方法了。方法和函数本质上是一样的,只是在不同的情况下的叫法不同。 
但当fn运行的时候,弹出的是window(任何函数被调用,this都表示window);而objFn运行的时候,弹出的是object,因为当它做为一个方法运行的时候,this关键字表示的是objFn这个属性所属的这个对象obj。也就是说,在这种情况下,this表示obj。 
再啰嗦一遍:当函数成为一个对象的属性的值的时候,这个函数里的this指向当前这个对象(这时候函数就变成了方法) 
    再啰嗦第三遍:当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。方法可以使用this去访问对象,所以它能从对象中取值或修改对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。 


二、函数调用模式  
当函数并非一个对象的属性时,那么它被当做一个函数来调用。此模式下this绑定到全局对象。通过在对象内将this赋值给that,可以使函数模式下调用that来访问指定对象。 
(就是上面解释的函数方式) 


三、类的实例上的方法中的this指向当前的实例  
例如: 
Js代码   收藏代码
  1. function Person(){  
  2.    
  3. }  
  4. Person.prototype.cry=function (){alert(this)}  
  5. var rose=new Person();  
  6. rose.cry();//现在这个cry就被称做方法,这个方法里的this就表示rose这个实例。  

详细的讲解,请见《面向对象和设计模式》的课堂讲解和视频 


四、使用call和apply方法强制改变this关键字  
(附在面向对象一章的讲解里) 
测试题: 
题目一: 
Js代码   收藏代码
  1. var name = "The Window";  
  2.   var object = {  
  3.     name : "My Object",  
  4.     getNameFunc : function(){  
  5.       return function(){  
  6.         return this.name;  
  7.      };  
  8.     }  
  9. };  
  10. alert(object.getNameFunc()()); //The Window  

解析:object.getNameFunc后面跟了两对括号。先运行object.getNameFunc(),这个方法运行后返回了一个函数,就是这个方法里面定义的那个匿名函数,然后再让这个匿名函数运行。 
可以分解成以下步骤: 
Js代码   收藏代码
  1. var fn= object.getNameFunc();//object.getNameFunc这个方法里的this是表示object这个对象,但它返回的是一个函数,返回的这个函数里的这个this则表示window了  
  2. fn();//当返回的这个函数运行的时候,this表示是window这个对象  


和上一题目类似的题: 
Js代码   收藏代码
  1. function a(){  
  2. alert(this);  
  3. }  
  4. var arr = [1,2,3];  
  5. arr.f = a;  
  6. arr.f();//会输出什么  

解析:把a函数赋给arr的属性f,则f就成为arr这个对象上的方法了,它运行的时候就表示arr这个数组对象。 
如果直接这样:a();  则这时候的this表示的是window这个对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值