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 相关文章推荐
JQuery扩展插件Validate—4设置错误提示的样式
Sep 05 Javascript
MooBox 基于Mootools的对话框插件
Jan 20 Javascript
解决js正则匹配换行问题实现代码
Dec 10 Javascript
解析Jquery的LigerUI如何实现文件上传
Jul 09 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
Jun 19 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
JS中利用FileReader实现上传图片前本地预览功能
Mar 02 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 Javascript
微信公众号网页分享功能开发的示例代码
May 27 Javascript
浅析VUE防抖与节流
Nov 24 Vue.js
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
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
javascript基础知识讲解
2017/01/11 Javascript
js实现图片360度旋转
2017/01/22 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
Python中的__slots__示例详解
2017/07/06 Python
python3 线性回归验证方法
2019/07/09 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
keras slice layer 层实现方式
2020/06/11 Python
为什么相对PHP黑python的更少
2020/06/21 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
八年级语文教学反思
2014/02/11 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
聘任书模板
2014/03/29 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
责任书格式
2015/01/29 职场文书
党支部评议意见
2015/06/02 职场文书
烈士陵园观后感
2015/06/08 职场文书
师德师风培训感言
2015/08/03 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers