源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 81|回复: 32

[JavaScript] javascript运行机制之this详细介绍

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2014-2-7 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元素。

回复

使用道具 举报

3

主题

2万

回帖

172

积分

注册会员

Rank: 2

积分
172
发表于 2022-11-6 07:44:58 | 显示全部楼层
的沙发水电费水电费
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

380

积分

中级会员

Rank: 3Rank: 3

积分
380
发表于 2023-1-15 01:53:35 | 显示全部楼层
建军节建军节建军节建军节
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

174

积分

注册会员

Rank: 2

积分
174
发表于 2023-1-24 19:56:22 | 显示全部楼层
看到这帖子真是高兴!
回复 支持 反对

使用道具 举报

1

主题

1386

回帖

1509

积分

金牌会员

Rank: 6Rank: 6

积分
1509
发表于 2023-3-3 13:22:17 | 显示全部楼层
2222222222222222
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

207

积分

中级会员

Rank: 3Rank: 3

积分
207
发表于 2023-8-20 20:52:00 | 显示全部楼层
好人好人好人好人
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-8-23 13:31:10 | 显示全部楼层
下载来瞧瞧
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

347

积分

中级会员

Rank: 3Rank: 3

积分
347
发表于 2023-10-18 02:15:47 | 显示全部楼层
论坛有你更精彩!
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-11-14 00:41:30 | 显示全部楼层
人都不在了啊 啊
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-3-4 20:31:00 | 显示全部楼层
哈哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2025-2-10 08:44 , Processed in 0.258028 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表