问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript中的this指向谁

发布网友 发布时间:2022-04-07 05:53

我来回答

4个回答

懂视网 时间:2022-04-07 10:14

1、基本概念

MDN的官方解释:与其他语言相比,函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别。在绝大多数情况下,函数的调用方式决定了this的值。this不能在执行期间被赋值,并且在每次函数被调用时this的值也可能会不同。

简而言之:

1.this指向的对象称为函数的上下文对象context;  

2.this的指向取决于函数被调用方式

不管函数怎么调用的天花乱坠,我们只要记住这几点即可清晰的找出this的指向。

2、小实验

function foo(){
 console.log(this);
}

面试官问你this指向哪里,当然大声回答不知道,原因:谁调用指向谁,函数都没被调用,确实不知道指向。

ddc2c733f89bd60276eadad56db53e6.png

小结:直接通过函数名来调用函数,this指向全局变量window;通过对象.函数名调用函数,this指向该对象。

3、DOM对象调用函数时this的指向问题

1.通过选择器选择元素加事件属性来绑定事件,this指向该DOM对象,例子如下:

document.getElementById('btn').onclick=function(){
 console.log('click'); //click
 console.log(this); //<button id="btn">button</button>
 }

2.直接在DOM标签中写事件,this指向window,我们可以通过吧this作为参数传入方法中再使用,例子如下:

html:
<button onclick="modify()">add</button>
<span id="count">0</span>
<button onclick="modify()">reduce</button>

script:
// 操作方法
 function modify(){
 console.log(this); //window
 }

因为这个时候是直接调用方法的,所以this指向全局window对象,那么问题来了,我们想判断我们点击的是哪一个按钮,应该怎么做呢,我们可以把this的值作为参数传入方法中再使用,例子如下。

html:
<button onclick="modify(this)">add</button>
<span id="count">0</span>
<button onclick="modify(this)">reduce</button>

script:
// 操作方法
 function modify(_this){
 console.log(_this); 
// <button onclick="modify(this)">add</button>
// <button onclick="modify(this)">reduce</button>
 }

4.对象中this的指向问题

先看一个简单的例子:

var a=1;
function printA(){
 console.log(this.a);
}
var obj={
 a:2,
 foo:printA,
 bar:function(){
 printA();
 }
}
obj.foo(); //2
obj.bar(); //1var foo=obj.foo;foo(); //1

我们定义了一个全局变量a和一个打印a的全局变量方法,之后又定义了一个obj对象,其中包含a属性和foo,bar两个方法。当我们调用obj.foo()打印了2,调用obj.bar()打印了1.

分析:

不管printA在哪里定义的,我们this的指向只取决于被谁调用的。在obj.foo(),foo的属性值为printA,被obj直接调用,所以this指向obj,this.a就是obj.a=2了;

当我们调用obj.bar()时,bar的属性值为function(){printA()},没有明确哪个对象来调用printA方法,this默认指向全局对象window,所以this.a=window.a=1;

第三种情况我们把obj.foo值赋予了foo变量,在调用的时候就相当于是window.foo()了,打印1。

小结:this的指向不是函数声明是绑定的,而是在函数运行过程中动态绑定的。

5.改变this的指向方法:applay call bind

话不多话:写了一个例子,大家先看,万一比喻不恰当,大家能理解其中意思即可

var liLei={
 name:'liLei',
 money:10,
 buyPen:function(){
 this.money=this.money-1;
 console.log(this.name+" have money:"+this.money)
 }
}

var hanMeiMei={
 name:'hanMeiMei',
 money:20,
 buyPan:function(){
 this.money=this.money-2;
 console.log(this.name+" have money:"+this.money)
 }
}

liLei.buyPen(); // liLei have money:9
hanMeiMei.buyPan(); //hanMeiMei have money:18

例子很好理解,输出的结果相信大家也能看得明白,哪天,韩梅梅想买一个盆,她买不了,因为她还没有这个方法,她一想:我没有这个方法,但是李雷有啊,我打电话给李雷把钱他让他帮我买啊;后来李雷想买一个盘,实现方法也是如此。那么,在代码中如何实现呢?

JavaScript有好几个方法可以实现:call,apply,bind。

call方法:

语法:call(thisObj,Object)

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

liLei.buyPen.call(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.call(liLei); //liLei have money:8

apply方法:

语法:apply(thisObj,[argArray])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

liLei.buyPen.apply(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei); //liLei have money:8

bind方法:

liLei.buyPen.bind(hanMeiMei)(); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei)(); //liLei have money:8

小结:三种方法的相同指出是:可以改变this的指向,不同之处是:apply接受的参数为一个数组,call接收的参数为一个个独立的值;apply,call会直接调用方法,bind改变this的指向返回一个方法不调用。

推荐教程:js教程

热心网友 时间:2022-04-07 07:22

his是指向当前引用对象
this.name = name;
-- 这个好理解,指向User对象,不是User function
this.my_alert = function() {
alert(this.name);
}
function 一个函数,这么理解有zhuan点“问题”,正shu确的说法是my_alert 是一个函数类型变量
my_alert 是User的一个属性,他本身是funtion类型,所以这个function类型中的this指向当前对象
this对象是在运行时基于函数的执行环境绑定的,它可能是全局对象或者其他的某个对象,随着函数的执行环境不同,this的值也会不一样。但是总有一个原则,那就是this指的是调用函数的那个对象。
还有另一个原则:当没有明确的调用函数的那个对象时,this指向全局对象global,浏览器模式下就是window了。
JavaScript:this是什么?
定义:this是包含它的函数作为方法被调用时所属的对象。
说明:这句话有点咬嘴,但一个多余的字也没有,定义非常准确,我们可以分3部分来理解它!
1、包含它的函数。2、作为方法被调用时。3、所属的对象。
看例子:
function to_green(){
this.style.color="green";
}
to_green();
上面函数中的this指的是谁?
分析:包含this的函数是,to_green
该函数作为方法被调用了
该函数所属的对象是。。?我们知道默认情况下,都是window对象。
OK,this就是指的window对象了,to_green中执行语句也就变为,window.style.color="green"
这让window很上火,因为它并没有style这么个属性,所以该语句也就没什么作用。
想要系统了解来尚学堂,线上线下,系统性教学。

热心网友 时间:2022-04-07 08:40

谁调用的a就指向谁,如果没写调用的对象,那么是windows。
obj.a();这时a里面在b后面括号里的this是obj。
如果直接调用a(),那么里面的this是windows(所有全局变量函数的对象)

热心网友 时间:2022-04-07 10:15

obj THIS 指向的是当前对象 当前对象就是OBJ追问可是obj1调用了b()呀,为什么不是他

追答this 指的是最外层的调用的对象 你就这么理解吧

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
福建南安都有哪些市场 端午节去南安旅行的线路有哪些值得分享? 南安有哪些特色商业街 把一个棱长是10厘米的正方体铁块熔铸成一个底面积是20厘米的圆锥形铁块... 把一块棱长10厘米的正方体铁块熔铸成一个底面直径是20厘米的圆柱形零件... 0x0438ef0指令引用的0x0438ef0内存.该内存不能为“read”的错误提示... SONY 索尼 DSC-RX100M5A 1英寸数码相机 黑色(8.8-25.7mm、F1.8) Vl... SONY 索尼 DSC-RX100M5A 1英寸数码相机 黑色(24-70mm、F1.8-F2.8)-购... 索尼RX100 M5A数码相机 索尼RX100 M5A数码相机:小巧便携,成像卓越 高考需要带的2B铅笔怎样辨别真假?是铅笔好,还是自动铅笔好? 高考用这种按动的2B笔,还是绿色的2B铅笔更好? 高考一定用2B铅笔? 高考一定要用2b铅笔吗 有什么音乐可以舒缓紧张烦躁的情绪 调节人心情的歌曲? 推荐几个比较舒缓调整心情的世界名曲特别是古典音乐? 心情不好的时候,听哪些歌可以调节心情? 请大家推荐适合调节情绪的音乐 你通常听哪种类型的音乐来舒缓心情? 有没有轻音乐啊,能舒缓情绪的那种 心情不好,求推荐一些能调解心情的歌,不要流行歌曲 有没有什么歌曲听了心情会变好的呢? 心情不好的时候听什么样的歌可以调节心情? 哪首歌曲可以缓解自己压抑的心情? 有什么音乐可以舒缓情绪的? 推荐一些欢快,听到能很快调整心态的歌曲。 听什么音乐可以放松心情,调整心态,谢谢 调节心情的歌曲有哪些呢? 可以调节心情的歌曲 支付宝送你余额体验包1280元立即收下是什么意思? 求js大佬回答一下this指向的问题 邦太物流怎么查单号 邦太物流单号查询161123230028 深圳市新邦泰物流有限公司怎么样? 成都市邦泰物流有限公司怎么样? 湖北邦泰仓储物流服务有限公司怎么样? 大连邦泰物流有限公司怎么样? 浙江邦泰物流有限公司怎么样? 唐山市邦泰物流有限公司介绍? 营口邦泰国际物流有限公司怎么样? JavaScript脚本中的this用法详细诠释? 怎么不用苹果手机上QQ显示Iphone QQ在线 Javascript中this的指向问题 太阳的结局将是: 太阳什么时候会燃烧殆尽? 太阳在生命的最后阶段将变成() 为何专家能推断出太阳的最终结局,是有相关例子吗? 天文知识竞赛题库 关于月亮的试题与答案