JavaScript中this的指向问题

本文详细解析了JavaScript中this关键字的不同应用场景及其指向的变化规律,包括纯函数、对象方法、构造函数、内部函数、call/apply调用及事件绑定等情况。
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指向的是全局对象)外,this指向的是绑定事件的Elment元素。

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值