`

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的指代混乱。
分享到:
评论

相关推荐

    Javascript的this用法

    ### JavaScript中的`this`用法详解 在JavaScript中,`this`关键字的使用十分常见,但也是最容易引起混淆的部分之一。正确理解`this`的工作原理对于编写高效、可靠的代码至关重要。本文将深入探讨`this`在不同上下...

    javascript中onclick(this)用法介绍

    总结来说,在javascript中,onclick(this)的用法主要是将当前被点击的元素作为上下文对象传递给事件处理函数。在事件处理函数内部,我们可以访问到这个对象的所有属性和方法,从而实现对事件的处理和响应。通过这种...

    javascript 中 this 的用法.docx

    ### JavaScript 中 `this` 的用法详解 #### 一、引言 在 JavaScript 开发过程中,`this` 关键字的使用常常令开发者感到困惑。这是因为 `this` 的值并不是静态确定的,而是取决于函数调用的方式。了解 `this` 的...

    javascript 中关于 this 的用法.zip

    在JavaScript编程语言中,...总结起来,JavaScript中的this用法是多样的,理解其行为并学会在不同场景下正确使用this是JavaScript开发者必备的技能。通过深入学习和实践,你将能够更有效地控制代码中的对象和函数行为。

    js中this用法实例详解

    下面将详细介绍JavaScript中this关键字的各种用法及其指向情况,以及如何改变this的指向。 一、this在全局作用域的指向 在JavaScript全局作用域中,this关键字默认指向全局对象。在浏览器环境中,这个全局对象是...

    javascript中的self和this用法小结

    本文将围绕self与this在JavaScript中的用法进行详细解析。 首先,我们从一段代码片段引入了self和this这两个概念的讨论。在JavaScript中,self并不是一个保留字或内置关键字,而是开发者通常用于指代this的一个变量...

    详解JavaScript中this关键字的用法_.docx

    总结起来,理解JavaScript中的`this`关键字至关重要,因为它在不同情境下有不同的行为。在编写代码时,正确地理解和使用`this`可以帮助我们更好地控制代码的执行环境,避免安全问题,比如避免意外修改全局变量,确保...

    js中call与apply的用法小结

    在JavaScript中,`call` 和 `apply` 是两种非常重要的函数调用方式,它们都用于改变函数执行时的上下文,即`this`的指向。本文将深入探讨这两种方法的用法及其在实际编程中的应用。 ### 1. `call` 的基本用法 `...

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

    总结起来,`this`和`super`是Java中非常重要的两个关键字,它们帮助我们处理对象的内部引用和继承关系中的问题。正确地使用它们能确保代码的清晰性和有效性,同时提高代码的可维护性。在编写Java代码时,了解和熟练...

    5分钟理解JavaScript中this用法分享

    总结来说,`this`在JavaScript中的行为取决于其调用环境。理解这些规则对于编写更健壮的JavaScript代码至关重要。在实践中,要特别注意`this`在函数调用、构造函数、方法调用以及事件处理中的不同表现。通过这些实例...

    javascript this用法小结

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

    javascript中this用法实例详解

    总结来说,JavaScript中的`this`用法相对灵活,需要开发者根据不同的调用场景来判断`this`的指向,并采取相应的策略来确保代码的正确执行。理解`this`的机制,不仅可以避免常见错误,还可以利用它来编写更加灵活的...

    js中call与apply的用法小结.docx

    在JavaScript中,`call`和`apply`是两个非常重要的函数,它们都允许开发者改变函数执行时的上下文,即`this`的指向。这两个方法主要用于实现函数的绑定和继承,以及处理数组或类数组对象。 首先,我们来看`call`的...

    js中arguments,caller,callee,apply的用法小结.docx

    在JavaScript中,arguments、caller、callee和apply是四个与函数调用相关的特性,它们在编写高级和复杂的函数逻辑时非常有用。下面将详细介绍这些概念及其用法。 1. **arguments对象** arguments对象是一个特殊...

    js中this对象用法分析

    在JavaScript中,`this`对象是一个非常关键的概念,它用于标识函数执行时的上下文,即函数被哪个对象调用。`this`的值不是在函数定义时确定,而是在函数执行时根据函数的调用方式动态绑定。下面将详细讨论几种常见的...

    js中prototype用法详细介绍.docx

    ### JavaScript中的Prototype用法详解 #### 一、引言 在JavaScript中,`prototype`是一个非常重要的概念,尤其是在面向对象编程(OOP)方面。通过理解并掌握`prototype`的使用,开发者可以更加灵活地扩展对象的功能,...

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

    在JavaScript中,`this`关键字是一个非常重要的概念,它用于引用当前执行上下文的对象。`this`的值在运行时动态确定,根据函数被调用的方式而变化。下面我们将通过一系列实例来深入理解`this`的关键字用法。 首先,...

    Javascript中this的用法详解

    JavaScript中的`this`关键字是一个非常重要的概念,它用于在函数执行时引用当前上下文的对象。在不同的场景下,`this`的指向会有所不同,本文将详细介绍四种常见的`this`用法。 1. 全局作用域与函数中的`this` 在...

Global site tag (gtag.js) - Google Analytics