中易网

如何理解 JavaScript 中的 this 关键字

答案:2  悬赏:50  
解决时间 2021-02-16 03:09
如何理解 JavaScript 中的 this 关键字
最佳答案
this是Javascript语言的一个关键字。<br>它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,<br>function test(){<br>this.x = 1;<br>}<br>随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。<br>下面分四种情况,详细讨论this的用法。<br>情况一:纯粹的函数调用<br>这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。<br>请看下面这段代码,它的运行结果是1。<br>function test(){<br>this.x = 1;<br>alert(this.x);<br>}<br>test(); // 1<br>为了证明this就是全局对象,我对代码做一些改变:<br>var x = 1;<br>function test(){<br>alert(this.x);<br>}<br>test(); // 1<br>运行结果还是1。再变一下:<br>var x = 1;<br>function test(){<br>this.x = 0;<br>}<br>test();<br>alert(x); //0<br>情况二:作为对象方法的调用<br>函数还可以作为某个对象的方法调用,这时this就指这个上级对象。<br>function test(){<br>alert(this.x);<br>}<br>var o = {};<br>o.x = 1;<br>o.m = test;<br>o.m(); // 1<br>情况三 作为构造函数调用<br>所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。<br>function test(){<br>this.x = 1;<br>}<br>var o = new test();<br>alert(o.x); // 1<br>运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:<br>var x = 2;<br>function test(){<br>this.x = 1;<br>}<br>var o = new test();<br>alert(x); //2<br>运行结果为2,表明全局变量x的值根本没变。<br>情况四 apply调用<br>apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。<br>var x = 0;<br>function test(){<br>alert(this.x);<br>}<br>var o={};<br>o.x = 1;<br>o.m = test;<br>o.m.apply(); //0<br>apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。<br>如果把最后一行代码修改为<br>o.m.apply(o); //1<br>运行结果就变成了1,证明了这时this代表的是对象o。<br>摘自阮一峰老师的博客。
全部回答
this的查找 this的查找是很多人迷茫的一点,也似乎有很多人抱有this不稳定这样的看法,实在令人无语。this的查找可以说是3种对象查找中最为简单的,因为其实this对象的确定根本没有一个“查找”的过程。 首先,this对象只会在一个函数中需要确定,如果是在全局域下,this永远为global对象,在浏览器中通常就是window对象。而在javascript中,函数的调用一共有4种方式: function invocation pattern 诸如`foo()`的调用形式被称为function invocation pattern,是函数最直接的使用形式,注意这里的foo是作为单独的变量出现,而不是属性。 在这种模式下,foo函数体中的this永远为global对象,在浏览器中就是window对象。 method invocation pattern 诸如`foo.bar()`的调用形式被称为method invocation pattern,注意其特点是被调用的函数作为一个对象的属性出现,必然会有“.”或者“[]”这样的关键符号。 在这种模式下,bar函数体中的this永远为“.”或“[”前的那个对象,如上例中就一定是foo对象。 constructor pattern `new foo()`这种形式的调用被称为constructor pattern,其关键字`new`就很能说明问题,非常容易识别。 在这种模式下,foo函数内部的this永远是new foo()返回的对象。 apply pattern `foo.call(thisobject)`和`foo.apply(thisobject)`的形式被称为apply pattern,使用了内置的`call`和`apply`函数。 在这种模式下,`call`和`apply`的第一个参数就是foo函数体内的this,如果thisobject是`null`或`undefined`,那么会变成global对象。 应用以上4种方式,确定一个函数是使用什么样的pattern进行调用的,就能很容易确定this是什么。 另外,this是永远不会延作用域链或原型链出现一个“查找”的过程的,只会在函数调用时就完全确认。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求下面电路的电压和电流值,设二极管是理想的
怡隆渔具手机我想知道这个在什么地方
疯岳撬佳人下载
北京市特种作业培训站地址有知道的么?有点事
201O年好看的电影和电视剧有哪些?
2014年暑假旅游淡季是什么时候
超级无绳是什么业务
我的红米1手机屏幕边缘总是闪烁是怎么回事啊
1985年阴历5月13日7点出生的男生
奥斯美吴川旗舰店在什么地方啊,我要过去处理
熊猫人武僧有军装吗?我怎么在商人那没见到》
月季通常几天浇水一次
麻竹高速公路/安广线(路口)地址有知道的么?
我人在深圳,在老家办流动人口婚育证明需要寄
企业的资本金按照投资主体的不同分为哪几种
推荐资讯
我的世界天使指环装上怎么不能飞啊,要下什么
古月楼地址在哪,我要去那里办事
4xe^2dx积分是多少,怎么算啊
鲜味包子饺子馆地址有知道的么?有点事想过去
安徽省阜阳市阜南县幼儿教师资格证书什么时候
路由器哪种好?
如何能自行测试布料的PH值
中兴张网我想知道这个在什么地方
崂山啤酒打开上面写着贰等奖a118 截 2019奖品
ISP给提供了一个固定IP和网关,怎么在华为S370
竞聘表中插入照片为何会如图?如何正确放入图
刘伯温2015六合欲钱料
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?