在javascript中this的指向一直是前端同事的心头病,也同时是各面试题的首选,现在我们就来总结一下js中this的指向。首先需要了解一下几个概念:

1:全局变量默认挂载在window对象下
2:一般情况下this指向它的调用者
3:es6的箭头函数中,this指向创建者,并非调用者
4:通过call、apply、bind可以改改变this的指向
下面我们具体分析一下
1:在函数调用时
(非严格模式)
const func = function () {
console.log(this);
const func2 = function () {
console.log(this);
};
func2(); //Window
};
func(); //Window
(严格模式)
'use strict'
const func = function () {
console.log(this);
const func2 = function () {
console.log(this);
};
func2(); //undefined
};
func(); //undefined
结合第四和第一两条规则:func这个函数是全局的,默认挂载在window对象下,this指向它的调用者即window,所以输出window对象,但是在严格模式下,this不允许指向全局变量window,所以输出为undefined(func2在函数直接调用时默认指向了全局window,其实这属于javascript设计上的缺陷,正确的设计方式是内部函数的this 应该绑定到其外层函数对应的对象上,为了规避这一设计缺陷,聪明的 JavaScript 程序员想出了变量替代的方法,约定俗成,该变量一般被命名为 that。这种方式在接下来会讲到)。
2:作为对象方法
const user = {
userName: '小张',
age: 18,
selfIntroduction: function () {
const str = '我的名字是:' + this.userName + ",年龄是:" + this.age;
console.log(str);
const loop = function () {
console.log('我的名字是:' + this.userName + ",年龄是:" + this.age);
};
loop(); //我的名字是:undefined,年龄是:undefined
}
};
user.selfIntroduction(); //我的名字是:小张,年龄是:18
按照咱的第一条规则,this指向他的调用者,selfIntroduction()方法的调用者是user,所以在selfIntroduction()方法内部this指向了他的父对象即user,而loop方法输出的为undefined的原因就是我在上面所说的javascript的设计缺陷了,在这种情况下,我们通常选择在selfIntroduction()方法里将this缓存下来。
const user = {
userName: '小张',
age: 18,
selfIntroduction: function () {
const str = '我的名字是:' + this.userName + ",年龄是:" + this.age;
console.log(str);
const that=this;
const loop = function () {
console.log('我的名字是:' + that.userName + ",年龄是:" + that.age);
};
loop(); //我的名字是:小张,年龄是:18
}
};
user.selfIntroduction(); //我的名字是:小张,年龄是:18
此时loop的this指向就理想了。
const user={
userName:'小张',
age:18,
selfIntroduction:function(){
const str='我的名字是:'+this.userName+",年龄是:"+this.age;
console.log(str);
}
};
const other =user.selfIntroduction;
other(); //我的名字是:undefined,年龄是:undefined
const data={
userName:'小李',
age:19,
};
data.selfIntroduction=user.selfIntroduction;
data.selfIntroduction(); //我的名字是:小李,年龄是:19
在看这段代码,将selfIntroduction()赋值给了全局变量other,调用other()方法,other挂载在全局函数window对象下,window对象下没有userName 和 age 这两个属性,所以输出为undefined。第二段代码,申明了data对象,包含了username和age属性,记住我们的第二条规则一般情况下this指向它的调用者,大家就明白了,data是selfIntroduction()的函数的调用者,所以输出了data的userName和age。
3:在html里作为事件触发
<body>
<div id="btn">点击我</div>
</body>
const btn=document.getElementById('btn');
btn.addEventListener('click',function () {
console.log(this); //<div id="btn">点击我</div>
})
在种情况其实也是遵循了第二条规则一般情况下this指向它的调用者,this指向了事件的事件源即event。
4:new关键字(构造函数)
const fun=function(userName){
this.userName=userName;
}
const user=new fun('郭德纲');
console.log(user.userName); //郭德纲
这个就不多赘述了,new关键字构造了一个对象实例,赋值给了user,所以userName就成为了user对象的属性。
5:es6(箭头函数)
const func1=()=>{
console.log(this);
};
func1(); //Window
const data={
userName:'校长',
selfIntroduction:function(){
console.log(this); //Object {userName: "校长", selfIntroduction: function}
const func2=()=>{
console.log(this); //Object {userName: "校长", selfIntroduction: function}
}
func2();
}
}
data.selfIntroduction();
大家在看看我开头说的第三条准则:es6的箭头函数中,this指向创建者,并非调用者,fun1 在全局函数下创建,所以this指向全局window,而fun2在对象data下创建,this指向data对象,所以在func2函数内部this指向data对象,个人认为es6的箭头函数的this指向是对我上面所说的javascript设计缺陷的改进,(个人认知)。
6:改变this的指向
call、apply、bind这三个函数是可以人为的改变函数的this指向的,在这里就不多说这三者的区别了,在往后的博客里我会详细解释这三者的区别的。现在先拿一个来举一个例子
const func=function(){
console.log(this);
};
func(); //window
func.apply({userName:"郭德纲"}); //Object {userName: "郭德纲"}
这三个方法都是可以人为的改变this的指向,区别是call、apply会将该方法绑定this之后立即执行,而bind方法会返回一个可执行的函数。
说这很多总结起来就是我开头说的4点
1:全局变量默认挂载在window对象下
2:一般情况下this指向它的调用者
3:es6的箭头函数中,this指向创建者,并非调用者
4:通过call、apply、bind可以改改变this的指向
说实话第一次写博客,确实挺忐忑的,会不会有人看我的博客?会不会写的不正确?……想好多了,总结了:不好的地方欢迎指正。
以上所述是小编给大家介绍的关于JavaScript中的this指向问题总结篇,希望对大家有所帮助,如果大家有任何问题,欢迎给我留言,小编会及时回复大家的!
# js
# this
# 指向
# JS中改变this指向的方法(call和apply、bind)
# 详解JS中定时器setInterval和setTImeout的this指向问题
# js绑定事件this指向发生改变的问题解决方法
# JS匿名函数内部this指向问题详析
# Angular.JS中的this指向详解
# JS 箭头函数的this指向详解
# 详解JavaScript中关于this指向的4种情况
# javascript改变this指向的方法汇总
# 调用者
# 小张
# 全局变量
# 会不会
# 给了
# 就是我
# 第二条
# 这三个
# 绑定
# 小李
# 小编
# 这三
# 都是
# 几个
# 这一
# 在这里
# 我会
# 对我
# 就不
# 约定俗成
相关文章:
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星展会模板:智能建站与自助搭建高效解决方案
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何快速搭建高效WAP手机网站吸引移动用户?
建站之星会员如何解锁更多建站功能?
建站主机与服务器功能差异如何区分?
C++中引用和指针有什么区别?(代码说明)
如何在阿里云香港服务器快速搭建网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
广州商城建站系统开发成本与周期如何控制?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站之星免费模板:自助建站系统与智能响应式一键生成
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何用y主机助手快速搭建网站?
如何通过FTP空间快速搭建安全高效网站?
建站之星各版本价格是多少?
如何选择靠谱的建站公司加盟品牌?
北京网站制作网页,网站升级改版需要多久?
用v-html解决Vue.js渲染中html标签不被解析的问题
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何快速搭建安全的FTP站点?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
南平网站制作公司,2025年南平市事业单位报名时间?
如何通过老薛主机一键快速建站?
如何通过云梦建站系统实现SEO快速优化?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
香港服务器网站卡顿?如何解决网络延迟与负载问题?
代购小票制作网站有哪些,购物小票的简要说明?
黑客入侵网站服务器的常见手法有哪些?
建站之星24小时客服电话如何获取?
内网网站制作软件,内网的网站如何发布到外网?
建站之星安装提示数据库无法连接如何解决?
深圳网站制作案例,网页的相关名词有哪些?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
西安大型网站制作公司,西安招聘网站最好的是哪个?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
建站之星安装后界面空白如何解决?
怎么将XML数据可视化 D3.js加载XML
css网站制作参考文献有哪些,易聊怎么注册?
已有域名和空间如何快速搭建网站?
如何规划企业建站流程的关键步骤?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何在云指建站中生成FTP站点?
存储型VPS适合搭建中小型网站吗?
威客平台建站流程解析:高效搭建教程与设计优化方案
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
*请认真填写需求信息,我们会在24小时内与您取得联系。