javascript运行机制之this详细介绍

 更新时间:2014年02月07日 14:43:28   作者:  
这篇文章主要介绍了javascript运行机制之this,需要的朋友可以参考下

this是面向对象语言中一个重要的关键字,理解并掌握该关键字的使用对于我们代码的健壮性及优美性至关重要。而javascript的this又有区别于Java、C#等纯面向对象的语言,这使得this更加扑朔迷离,让人迷惑。

this使用到的情况:
1. 纯函数
2. 对象方法调用
3. 使用new调用构造函数
4. 内部函数
5. 使用call / apply
6.事件绑定

1. 纯函数

复制代码 代码如下:

var name = 'this is window';  //定义window的name属性 
function getName(){ 
       console.log(this);    //控制台输出: Window  //this指向的是全局对象--window对象 
       console.log(this.name);  //控制台输出: this is window  / 


 
getName(); 

运行结果分析:纯函数中的this均指向了全局对象,即window。

2. 对象方法调用

复制代码 代码如下:

var name = 'this is window';  //定义window的name属性,看this.name是否会调用到 
var testObj = { 
    name:'this is testObj', 
    getName:function(){ 
        console.log(this);  //控制台输出:testObj   //this指向的是testObj对象 
        console.log(this.name);  //控制台输出: this is testObj 
    } 


testObj.getName(); 

运行结果分析:被调用方法中this均指向了调用该方法的对象。

3.  使用new调用构造函数

复制代码 代码如下:

function getObj(){ 
    console.log(this);    //控制台输出: getObj{}  //this指向的新创建的getObj对象 


new getObj(); 

运行结果分析:new 构造函数中的this指向新生成的对象。

4. 内部函数

复制代码 代码如下:

var name = "this is window";  //定义window的name属性,看this.name是否会调用到 
var testObj = { 
    name : "this is testObj", 
    getName:function(){ 
        //var self = this;   //临时保存this对象 
        var handle = function(){ 
            console.log(this);   //控制台输出: Window  //this指向的是全局对象--window对象 
            console.log(this.name);  //控制台输出: this is window   
            //console.log(self);  //这样可以获取到的this即指向testObj对象 
        } 
        handle(); 
    } 


testObj.getName();

运行结果分析:内部函数中的this仍然指向的是全局对象,即window。这里普遍被认为是JavaScript语言的设计错误,因为没有人想让内部函数中的this指向全局对象。一般的处理方式是将this作为变量保存下来,一般约定为that或者self,如上述代码所示。

5. 使用call / apply

复制代码 代码如下:

var name = 'this is window';  //定义window的name属性,看this.name是否会调用到 
var testObj1 = { 
    name : 'this is testObj1', 
    getName:function(){ 
        console.log(this);   //控制台输出: testObj2  //this指向的是testObj2对象 
        console.log(this.name);  //控制台输出: this is testObj2   
    } 


var testObj2 = { 
    name: 'this is testObj2' 


testObj1.getName.apply(testObj2); 
testObj1.getName.call(testObj2); 

Note:apply和call类似,只是两者的第2个参数不同:
[1] call( thisArg [,arg1,arg2,… ] );  // 第2个参数使用参数列表:arg1,arg2,... 
[2] apply(thisArg [,argArray] );     //第2个参数使用 参数数组:argArray
运行结果分析:使用call / apply  的函数里面的this指向绑定的对象。

6. 事件绑定
事件方法中的this应该是最容易让人产生疑惑的地方,大部分的出错都源于此。

复制代码 代码如下:

//页面Element上进行绑定 
  <script type="text/javascript"> 
     function btClick(){ 
        console.log(this);  //控制台输出: Window  //this指向的是全局对象--window对象 
    } 
  </script> 
  <body> 
    <button id="btn" onclick="btClick();" >点击</button> 
  </body> 

复制代码 代码如下:

//js中绑定方式(1) 
  <body> 
    <button id="btn">点击</button> 
  </body> 
  <script type="text/javascript"> 
     function btClick(){ 
        console.log(this);  //控制台输出:<button id="btn">点击</button>  //this指向的是Element按钮对象 
     } 

     document.getElementById("btn").onclick = btClick; 
     document.getElementById("btn").onclick;   
  </script> 

复制代码 代码如下:

//js中绑定方式(2) 
<body> 
   <button id="btn">点击</button> 
 </body> 
 <script type="text/javascript"> 
    document.getElementById("btn").onclick = function(){ 
     console.log(this);  //控制台输出:<button id="btn">点击</button>  //this指向的是Element按钮对象 
    } 
    document.getElementById("btn").onclick; 
 </script> 

复制代码 代码如下:

//js中绑定方式(3) 
<body> 
   <button id="btn">点击</button> 
 </body> 
 <script type="text/javascript"> 
    function btClick(){ 
        console.log(this);   
     } 

    document.getElementById("btn").addEventListener('click',btClick); //控制台输出:<button id="btn">点击</button>  //this指向的是Element按钮对象把函数(方法)用在事件处理的时候。 
    document.getElementById("btn").attachEvent('onclick',btClick);  //IE使用,控制台输出: Window  //this指向的是全局对象--window对象 
 </script> 

运行结果分析:以上2种常用事件绑定方法,在页面Element上的进行事件绑定(onclick="btClick();"),this指向的是全局对象;而在js中进行绑定,除了attachEvent绑定的事件方法外,this指向的是绑定事件的Elment元素。

相关文章

  • 实例区别onClick和onDBClick两事件方法

    实例区别onClick和onDBClick两事件方法

    实例区别onClick和onDBClick两事件方法
    2008-09-09
  • 基于JavaScript 下namespace 功能的简单分析

    基于JavaScript 下namespace 功能的简单分析

    前些天在剥离 百度随心听 的播放器引擎时,看到了一个namespace方法,觉得新奇,当然只是对于我自己而言,我入门js不久,经验尚浅
    2013-07-07
  • js setTimeout opener的用法示例详解

    js setTimeout opener的用法示例详解

    opener: 指parent表示父窗口,比如一个A页面利用iframe或frame调用B页面,那么A页面所在窗口就是B页面的parent,下面为大家介绍下其详细的使用方法,感兴趣的朋友可以参考下
    2013-10-10
  • Javascript模块化编程(一)AMD规范(规范使用模块)

    Javascript模块化编程(一)AMD规范(规范使用模块)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊
    2013-01-01
  • 初学JavaScript第一章

    初学JavaScript第一章

    下面为自己初学JavaScript时觉得应该注意的地方(从<<JavaScript动态网页开发详解>>中学到)
    2008-09-09
  • JavaScript中的6种运算符总结

    JavaScript中的6种运算符总结

    这篇文章主要介绍了JavaScript中的6种运算符总结,本文总结了算术运算符、赋值运算符、比较运算符、三元运算符、逻辑运算符、字符串连接运算符等,需要的朋友可以参考下
    2014-10-10
  • JS同步、异步、延迟加载的方法

    JS同步、异步、延迟加载的方法

    本篇文章讲述了JS同步、异步、延迟加载的方法,具有很好的参考价值,希望对大家的学习有所帮助
    2018-05-05
  • 关于JS 预解释的相关理解

    关于JS 预解释的相关理解

    下面小编就为大家带来一篇关于JS 预解释的相关理解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 实例讲解JavaScript中instanceof运算符的用法

    实例讲解JavaScript中instanceof运算符的用法

    JavaScript中的instanceof运算符可以用来判断对象类型,而更重要的是instanceof能够判断对象的继承关系,这里我们就来以实例讲解JavaScript中instanceof运算符的用法
    2016-06-06
  • 简介JavaScript中valueOf()方法的使用

    简介JavaScript中valueOf()方法的使用

    这篇文章主要介绍了简介JavaScript中valueOf()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06

最新评论