`

js 中this用发小结

阅读更多
js中this的总结
在面向对象编程语言中,对于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的指代混乱。
分享到:
评论

相关推荐

    java中this&super的用法小结.doc

    java中this&super的用法小结.doc

    javascript中的self和this用法小结

    一、 起因 那天用到prototype.js于是打开看看,才看几行就满头雾水,原因是对js的面向对象不是很熟悉,于是百度+google了一把,最后终于算小有收获,写此纪念一下^_^。 prototype.js代码片段 代码如下:var Class = {...

    javascript this用法小结

    但是在javascript中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时也带来了编程上的 自由和灵活,结合apply(call)方法,可以使JS变...

    JavaScript中this用法学习笔记

    在本篇文章里小编给大家分享了关于JavaScript中this用法学习笔记以及知识点总结,有兴趣的朋友们学习下。

    JavaScript中this关键字用法实例分析

    主要介绍了JavaScript中this关键字用法,结合实例形式总结分析了javascript中this关键字在不同条件下的指向问题与相关操作技巧,需要的朋友可以参考下

    原生javascript中this几种常见用法总结

    主要介绍了原生javascript中this几种常见用法,结合实例形式总结分析了JavaScript中this的功能、常见用法及操作注意事项,需要的朋友可以参考下

    javascript中this的用法实践分析

    主要介绍了javascript中this的用法,结合具体实例形式总结分析了javascript中this各种常见的功能、用法及相关操作注意事项,需要的朋友可以参考下

    js中call与apply的用法小结

    前天去面试,有个gg问了一些js知识,其中有一道call与apply用法的题目,尽管在365天前用过call方法,但当时还是没能答上来,今天深入总结一下 call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两者的...

    javascript中break,continue和return语句用法小结

    break,continue和return这三个语句的用法新手们经常弄混淆,至少在我学习c语言的时候经常把它们的用法给搞错。不过现在好了,我已彻底搞清楚它们之间的用法

    JavaScript中的this基本问题实例小结

    主要介绍了JavaScript中的this基本问题,结合实例形式总结分析了JavaScript中this的功能、常见用法与操作注意事项,需要的朋友可以参考下

    jquery 插件开发 extjs中的extend用法小结

    在jquery中,extend其实在做插件时还是用的比较多的,今天同时小结jquery和ext js中 的extend用法,先来看jquery中的。 1) extend(dest,src1,src2,src3…); 代码如下: var start = { id: 123, count: 41, desc: ...

    JS apply用法总结和使用场景实例分析

    本文实例讲述了JS apply用法总结和使用场景。分享给大家供大家参考,具体如下: apply是绑定this到指定函数或类,也可以说把函数或者类的方法和属性给到当前作用域。 1,使用apply实现继承 function A(name, age){...

    浅谈Vue.js中ref ($refs)用法举例总结

    本篇文章主要介绍了浅谈Vue.js中ref ($refs)用法举例总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    js中继承的几种用法总结(apply,call,prototype)

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 代码如下:&lt;SPAN xss=removed&gt;&lt;SPAN xss=removed&gt;&lt;html&gt; &lt;body&gt; [removed] function Person(name,age){ this.name=name; this....

    location.href用法总结(最主要的)

    javascript中的location.href有很多种用法,主要如下。 self.location.href=”/url” 当前页面打开URL页面 location.href=”/url” 当前页面打开URL页面 windows.location.href=”/url” 当前页面打开URL页面,前面...

    详解A标签中href=””的几种用法

    而且,大多数人认为a标签最重要的作用是实现超链接,今天我刚好碰到a标签的一种写法&lt;a&gt;&lt;/a&gt;,所以就来整理下a标签中href的几种用法。 一、js的几种调用方法(参考总结的)  1、a href="[removed]js_method();"  这...

Global site tag (gtag.js) - Google Analytics