百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 行业知识 > 正文

JavaScript this用法汇总

citgpt 2024-11-25 10:04 4 浏览 0 评论

JavaScript中this关键字使用方法详解

在面向对象编程语言中, 对于this关键字我们是非常熟悉的。

JavaScript this用法汇总

比如C++、C#和Java等都提供了这个关键字, 虽然在开始学习的时候觉得比较难, 但只要理解了, 用起来是非常方便和有意义的。

JavaScript也提供了这个this关键字, 不过用起来就比经典OOP语言中要"混乱"的多了。

下面就来看看, 在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 type="text/javascript">
var div = document.getElementById('elmtDiv');
//div.attachEvent('onclick', EventHandler); //IE浏览器事件监听的方法
div.addEventListener('click', EventHandler); //W3C浏览器事件监听的方法
function EventHandler(){
// 在此使用this
console.log(EventHandler.caller); //null
console.log(this); //<div id="elmtDiv">division element</div>
alert(this) //[object Window]
//alert(this.event.srcElement); //IE浏览器获取事件对象的方法 [object HTMLDivElement]
console.log(event.target); //W3C浏览器获取事件对象的方法 <div id="elmtDiv">division element</div>
alert(event.target); // [object HTMLDivElement]
}
</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'; //公有变量
console.log(this) //JSClass {m_Name: "JSClass"}
}
JSClass.prototype.ToString = function(){
//alert(myName + ', ' + this.m_Name); //程序不能正常运行
alert(this.myName + "," + this.m_Name); //结果为undefined JSClass
console.log(this) //JSClass {m_Name: "JSClass"}
};
var jc = new JSClass();
jc.ToString();

这是JavaScript模拟类定义中对this的使用, 这个和其它的OOP语言中的情况非常的相识。但是这里要求成员属性和方法必须使用this关键字来引用,

运行上面的程序会被告知myName未定义, this.m_Name则可以访问(m_Name必须使用this关键字引用, 才能访问)

5、为脚本引擎内部对象添加原型方法中的this关键字:

Function.prototype.GetName = function(){
var fnName = this.toString();
//alert(fnName); //function foo(){}
fnName = fnName.substr(0, fnName.indexOf('(')); //去掉()后内容
//alert(fnName); //function foo
fnName = fnName.replace(/^function/, ''); //去掉function关键字
//alert(fnName); // foo
return fnName.replace(/(^\s+)|(\s+$)/g, ''); //去掉空格
}
function foo(){}
alert(foo.GetName()); //foo

这里的this指代的是被添加原型的类的实例(function foo(){}), 和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);
//this.ToString访问不到原型的扩展函数,弹出警告框(undefined)
}

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变量作用域的问题决定的;

说了这么多JavaScript中this的用法, 其实this最根本的特性还是和OOP语言中的定义相吻合的。之所以有这么多看似混乱的使用方式,

是因为JavaScript语言(解释器和语言本身的内容)本身在实现上是遵循OOP的(Object-based), 连它的所有数据类型都是对象,

也有Object这样一个super Object。但是这个语言在运行上(runtime), 就没有遵循完备的OOP特点, 所以就出现了this的指代混乱。

总结

以上可以归纳为:"this所指的就是直至包含this指针的上层对象"

调用形式 this指向

普通函数 全局对象window

对象的方法 该对象

构造函数 新构造的对象

相关推荐

Win7打开网页特别慢的原因?

经常打开Web的频繁用户的数量应该打开,因此,一旦网页的速度很慢,它会变得非常敏感。最近,Win7系统的用户发现他们打开了他们的网页,突然放慢了,绝不看网络速度和配置因素,最有可能是系统内存问题。如果...

电脑浏览器下载速度很慢怎么办

有网友反映自己的浏览器下载速度很慢怎么办?这种通过可能是浏览器缓存太多,没有优化等原因导致。下面小编就以几种常用的浏览器为例,给大家解答下...

网站打开慢的问题如何解决?

  当我们在浏览网页时,突然发现一个网站打不开或者加载速度非常慢,这时候你会不会感到很烦躁呢?别担心,今天我们就来教你解决网站打开慢的问题!  一、检查网络连接  我们需要确保自己的网络连接正常。请尝...

打开网页速度慢、下载速度慢、玩游戏延迟、频繁掉线的解决方法

影响实际上网速度的因素非常多,需要挨个做排查1、先排除是否是网络环境问题,可以核实以下情况,来判断是否是网络环境问题。(1)同一网络环境,如果其他电脑上网也很慢,则可判断是网络本身速度不快导致的。(2...

浏览器太卡、启动慢,教你一招提速至少一倍!

电脑端浏览器用久了都会有一个毛病那就是开启速度非常缓慢今天教大家一个小技巧可大大提升浏览器启动速度适用于QQ、360、搜狗等大多数浏览器提速效果非常明显启动速度至少要快一倍SpeedyFox支持平台:...

网站访问慢的排查方案(最详细)

说实话,比起网站打不开,网站访问慢更让人抓狂。因为造成网站访问慢的因素太多了,一般用户根本无从下手!任他千头万绪的问题,从以下三个方面入手,也能轻松破解访问慢的大难题:响应时间、执行时间、加载时间。...

电脑网页打开慢怎么办?金山毒霸电脑医生秒搞定

??在网络时代,上网是每天都会做的事,平时用手机上网比较多,但是工作的时候还是用电脑上网的,不管手机还是电脑都会越用越慢。有时会觉得,电脑配置也不低,每天都清理垃圾了都,网速也还行电脑怎么还上网这么慢...

家里wifi慢是怎么回事?教你几招提速方法

没WiFi,不成活!手机和WiFi之间,就像空调加棉被,谁也离不开谁。如今WiFi已经填满了我们生活的每个角落,很难想象,如果哪天没了网,世界会变成什么样!可是家里的WiFi是越用越慢,不知道有多少人...

连接路由器宽带测速正常,打开网页很慢?

电脑连接路由器后测试网速和申请的宽带一致,但打开网页的速度较慢,请参考以下步骤排查:1、更改DNS服务器电脑上获取的DNS服务器不稳定可能会导致打开网页较慢,可以在电脑的本地连接或无线连接手动设置DN...

手机打开网页非常慢,那是你用的浏览器不对!

今天世超独宠Android差友不知道大家平日里,在刷着微博浏览着新闻的时候有没有遇见过这样的情况:在你浏览的过程中,总会出现一些让你感兴趣的链接。这些链接可能是:”这个视频,女人不在家男人偷偷看!”“...

网站打开慢的原因有哪些?

网络能够为大家带来许多便利,现在的人们不管是在学习或者是工作当中都是离不开网络的。在网络中,各大网页和网站也是我们浏览信息的主要渠道。如果想要更加高效率的工作和学习的话,当然也离不开网站浏览速度的支持...

告诉你导致网站页面打开速度慢的几种情况

导致网站页面打开速度慢的原因有很多,主要注意以下几个方面,就能做到很好的避免。...

浏览器变慢有救了!只要2秒,重回新安装一样爽快!

而最近有小伙伴在后台留言,说自己电脑浏览器用久了后,速度变得越来越慢了。特别是用久后,每次打开浏览器加载半天,经常白屏卡上那么一小会,体验上要比看这loging在转还难受,差点以为死机了。其...

导致网站打开慢的原因以及解决方法

是什么原因会导致网站打开慢?又有什么办法解决呢?一般来说,http请求过多、网页过大、服务器性能过差等等都可能导致网站打开慢。www.xy3000.com小蚁云安全乔妹为您分享一些参考解决方法:研究表...

还在为打开网页慢而苦恼吗?试试这招

不知道大家有没有这种感觉,家里网速明明很快,有20M,50M甚至100M,但不知道为什么打开网页,浏览页面的时候总感觉加载速度很慢。其实上网速度的快慢不仅仅取决于你家的宽带速度,也跟你的电脑硬件,系...

取消回复欢迎 发表评论: