JavaScript中this关键字使用方法详解


Posted in Javascript onMarch 08, 2007

在面向对象编程语言中,对于this关键字我们是非常熟悉的。比如C++、C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的。JavaScript也提供了这个this关键字,不过用起来就比经典OO语言中要"混乱"的多了。

    下面就来看看,在JavaScript中各种this的使用方法有什么混乱之处?

    1、在HTML元素事件属性中inline方式使用this关键字: 

 <div onclick="
 // 可以在里面使用this

 ">division element</div>

    我们一般比较常用的方法是在此使用:javascirpt: EventHandler(this),这样的形式。不过这里其实可以写任何合法的JavaScript语句,要是高兴在此定义个类也可以(不过将会是个内部类)。这里的原理是脚本引擎生成了一个div实例对象的匿名成员方法,而onclick指向这个方法。

    2、用DOM方式在事件处理函数中使用this关键字: 

 

<div id="elmtDiv">division element</div>  
 <script language="javascript">  
 var div = document.getElementById('elmtDiv');  
 div.attachEvent('onclick', EventHandler);   function EventHandler()  
 {  
    // 在此使用this  
 }  
 </script> 

    这时的EventHandler()方法中的this关键字,指示的对象是IE的window对象。这是因为EventHandler只是一个普通的函数,对于attachEvent后,脚本引擎对它的调用和div对象本身没有任何的关系。同时你可以再看看EventHandler的caller属性,它是等于null的。如果我们要在这个方法中获得div对象引用,应该使用:this.event.srcElement。

    3、用DHTML方式在事件处理函数中使用this关键字:

 <div id="elmtDiv">division element</div>
 <script language="javascript">
 var div = document.getElementById('elmtDiv');
 div.onclick = function()
 {
    // 在此使用this
 };
 </script>

    这里的this关键字指示的内容是div元素对象实例,在脚本中使用DHTML方式直接为div.onclick赋值一个EventHandler的方法,等于为div对象实例添加一个成员方法。这种方式和第一种方法的区别是,第一种方法是使用HTML方式,而这里是DHTML方式,后者脚本解析引擎不会再生成匿名方法。

    4、类定义中使用this关键字: 

 

 function JSClass()  
  {  
      var myName = 'jsclass';  
      this.m_Name = 'JSClass';  
  }    JSClass.prototype.ToString = function()  
  {  
      alert(myName + ', ' + this.m_Name);  
  };  
  var jc = new JSClass();  
  jc.ToString(); 

    这是JavaScript模拟类定义中对this的使用,这个和其它的OO语言中的情况非常的相识。但是这里要求成员属性和方法必须使用this关键字来引用,运行上面的程序会被告知myName未定义。

    5、为脚本引擎内部对象添加原形方法中的this关键字: 

  

Function.prototype.GetName = function()  
  {  
      var fnName = this.toString();   
      fnName = fnName.substr(0, fnName.indexOf('('));   
      fnName = fnName.replace(/^function/, '');   
      return fnName.replace(/(^\s+)|(\s+$)/g, '');  
  }  
  function foo(){}  
  alert(foo.GetName());     

    这里的this指代的是被添加原形的类的实例,和4中类定义有些相似,没有什么太特别的地方。

    6、结合2&4,说一个比较迷惑的this关键字使用: 

 

 function JSClass()  
  {  
      this.m_Text = 'division element';  
      this.m_Element = document.createElement('DIV');  
      this.m_Element.innerHTML = this.m_Text;        this.m_Element.attachEvent('onclick', this.ToString);  
  }  
  JSClass.prototype.Render = function()  
  {  
      document.body.appendChild(this.m_Element);  
  }       
  JSClass.prototype.ToString = function()  
  {  
      alert(this.m_Text);  
  };  
  var jc = new JSClass();  
  jc.Render();   
  jc.ToString(); 

    我就说说结果,页面运行后会显示:"division element",确定后点击文字"division element",将会显示:"undefined"。

    7、CSS的expression表达式中使用this关键字: 

 

 <table width="100" height="100">  
      <tr>  
          <td>  
              <div style="width: expression(this.parentElement.width);   
                    height: expression(this.parentElement.height);">  
                  division element</div>  
          </td>  
      </tr>  
  </table> 

    这里的this看作和1中的一样就可以了,它也是指代div元素对象实例本身。

    8、函数中的内部函数中使用this关键字: 

 

 function OuterFoo()  
  {  
      this.Name = 'Outer Name';        function InnerFoo()  
      {  
          var Name = 'Inner Name';   
          alert(Name + ', ' + this.Name);  
      }  
      return InnerFoo;  
  }  
  OuterFoo()(); 

    运行结果显示是:"Inner Name, Outer Name"。按我们在2中的讲解,这里的结果如果是"Inner Name, undefined"似乎更合理些吧?但是正确的结果确实是前者,这是由于JavaScript变量作用域的问题决定的,详细了解推荐参看"原来JScript中的关键字'var'还是有文章的"一文及回复。

    说了这么多JavaScript中this的用法,其实this最根本的特性还是和OO语言中的定义相吻合的。之所以有这么多看似混乱的使用方式,是因为JavaScript语言(解释器和语言本身的内容)本身在实现上是遵循OO的(Object-based),连它的所有数据类型都是对象,也有Object这样一个super Object。但是这个语言在运行上(runtime),就没有遵循完备的OO特点,所以就出现了this的指代混乱。

    JavaScript里还有什么地方有this的使用呢?我暂时能想到的就这些了,欢迎讨论补充。

Javascript 相关文章推荐
20个非常有用的PHP类库 加速php开发
Jan 15 Javascript
JS动态获取当前时间,并写到特定的区域
May 03 Javascript
jquery复选框checkbox实现删除前判断
Apr 20 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
浅谈JS中逗号运算符的用法
Jun 12 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
Aug 02 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
Vue创建头部组件示例代码详解
Oct 23 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
JS如何实现在弹出窗口中加载页面
Dec 03 Javascript
区分JS中的undefined,null,&quot;&quot;,0和false
Mar 08 #Javascript
在JavaScript中使用inline函数的问题
Mar 08 #Javascript
JS类中定义原型方法的两种实现的区别
Mar 08 #Javascript
JavaScript语言中的Literal Syntax特性分析
Mar 08 #Javascript
从JavaScript的函数重名看其初始化方式
Mar 08 #Javascript
翻译整理的jQuery使用查询手册
Mar 07 #Javascript
用window.location.href实现刷新另个框架页面
Mar 07 #Javascript
You might like
php自定文件保存session的方法
2014/12/10 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
设置python3为默认python的方法
2018/10/31 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
浅析Python 多行匹配模式
2020/07/24 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
支教自我鉴定
2014/01/18 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
交通志愿者活动总结
2014/06/27 职场文书
建筑结构施工求职信
2014/07/11 职场文书
新闻编辑求职信
2014/07/13 职场文书
廉洁自律证明
2015/06/24 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Python基础之pandas数据合并
2021/04/27 Python
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android