如何理解 JavaScript 中的 this 关键字
答案:2 悬赏:50
解决时间 2021-02-16 03:09
- 提问者网友:相思故
- 2021-02-15 07:52
如何理解 JavaScript 中的 this 关键字
最佳答案
- 二级知识专家网友:厭世為王
- 2021-02-15 08:02
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>摘自阮一峰老师的博客。
全部回答
- 1楼网友:情战辞言
- 2021-02-15 08:47
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是永远不会延作用域链或原型链出现一个“查找”的过程的,只会在函数调用时就完全确认。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯