JavaScript中this的学习笔记及用法整理


Posted in Javascript onFebruary 17, 2020

很多人可能会有疑问,this到底是什么?为什么this的值变化多端?

首先我们来概括下this.

this是一个对象,一般存在于函数中,表示当前函数的执行上下文;

值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容

普通函数

普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例:

var x=11;
var obj={
 x:22,
 say:function(){
  console.log(this.x)
 }
}
obj.say();
//console.log输出的是22
//调用say函数的是对象obj,所以this指代对象obj,输出的就是obj对象里的x值,即22。

箭头函数

箭头函数中的this,资料上说的箭头函数内部是没有this的,也就是说,箭头函数里面的this会继承自外部的this,下面有个例子,用来详细说明下:

var x=11;
var obj={
 x:22,
 y:this,//window
 say:()=>{
  console.log(this.x);
 }
}
obj.say();
//输出的值为11
console.log(obj.y);
//输出的值为window对象
//obj对象中的this指代的就是window,也就是全局环境,因为箭头函数中的this就会就近找到上一个对象中this所指代的对象,从以上例子可以看出来,obj内部属性y就为obj内部this指代的对象,输出是window。

由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值,

1、所以 call() / apply() / bind() 方法对于箭头函数来说只是传入参数,对它的 this 毫无影响。

2、考虑到 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。(可以忽略是否在严格模式下的影响)
因为箭头函数可以捕获其所在上下文的this值 所以

function Person() { 
  this.age = 0; 
  setInterval(() => {
    // 回调里面的 `this` 变量就指向了期望的那个对象了
    this.age++;
  }, 3000);
}

var p = new Person();

两个例子加深印象

普通函数

var a=11
function test1(){
 this.a=22;
 let b=function(){
  console.log(this.a);
 };
 b();
}
var x=new test1();
//输出11

为什么会输出11?因为普通函数中的this指向的是调用它的对象,如果没有直接调用对象,会指向undefined或者window,一般都会指向window,在严格模式下才会指向undefined。上述的例子中,并没有明确的调用对象,而普通函数中的this并不会向上继续找对象,所以直接返回window。

箭头函数

var a=11;
function test2(){
 this.a=22;
 let b=()=>{console.log(this.a)}
 b();
}
var x=new test2();
//输出22

箭头函数中会往上寻找this,直到找到所代表的this为止。例子中,构造函数被实例化成为一个对象x,那x中的this指代的就是对象x本身,所以箭头函数this就代表x对象,x对象内部的a值为22,所以输出22。

总结

1、箭头函数中的this是在声明中就定义好了的,而普通函数中的this则是在调用时定义好的。

2、箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值。正是因为它没有this,所以也就不能用作构造函数。,

3、若想改变this指向可以用bind方法。bind方法在ES5引入, 在Function的原型链上, Function.prototype.bind。通过bind方法绑定后, 函数将被永远绑定在其第一个参数对象上, 而无论其在什么情况下被调用。

以上就是三水点靠木小编整理的全部相关知识点,希望能够帮助到大家。

Javascript 相关文章推荐
JS获取页面窗口大小的代码解读
Dec 01 Javascript
jquery高效反选具体实现
May 05 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
May 07 Javascript
jQuery查询数据返回object和字符串影响原因是什么
Aug 09 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
Apr 12 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
JS判断数组里是否有重复元素的方法小结
May 21 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
Sep 10 Javascript
浅谈webpack和webpack-cli模块源码分析
Jan 19 Javascript
关于Vue中$refs的探索浅析
Nov 05 Javascript
Vue 中使用 typescript的方法详解
Feb 17 #Javascript
vue框架中props的typescript用法详解
Feb 17 #Javascript
JS通用方法触发点击事件代码实例
Feb 17 #Javascript
JS前端广告拦截实现原理解析
Feb 17 #Javascript
JavaScript代码异常监控实现过程详解
Feb 17 #Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
Feb 17 #Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 #Javascript
You might like
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php 伪静态之IIS篇
2014/06/02 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
举例介绍Python中的25个隐藏特性
2015/03/30 Python
python实现统计代码行数的方法
2015/05/22 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
销售找工作求职信
2013/12/20 职场文书
家长会邀请书
2014/01/25 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
工程技术员岗位职责
2014/03/02 职场文书
留学推荐信范文
2014/05/10 职场文书
投标授权委托书范文
2014/08/02 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
个人自我剖析材料
2014/09/30 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python