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 相关文章推荐
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 Javascript
JavaScript动态修改背景颜色的方法
Apr 16 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
关于Ajax的原理以及代码封装详解
Sep 08 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
解决vuex数据页面刷新后初始化操作
Jul 26 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 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的explode和implode的使用说明
2011/07/17 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
python实现月食效果实例代码
2019/06/18 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python字典底层实现原理详解
2019/12/18 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
教师个人自我评价范文
2014/04/13 职场文书
环保倡议书怎么写
2014/05/16 职场文书
消防安全标语
2014/06/07 职场文书
会计岗位说明书
2014/07/29 职场文书
技术负责人岗位职责
2015/02/10 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
2015中学学校工作总结
2015/07/20 职场文书
寒假生活随笔
2015/08/15 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技