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 相关文章推荐
两种方法实现文本框输入内容提示消失
Mar 17 Javascript
jQuery 回车事件enter使用示例
Feb 18 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
Aug 04 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
jquery显示隐藏元素的实现代码
May 19 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
canvas实现爱心和彩虹雨效果
Mar 09 Javascript
js编写选项卡效果
May 23 Javascript
Async Validator 异步验证使用说明
Jul 03 Javascript
JS实现图片切换效果
Nov 17 Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 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
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
Python列表计数及插入实例
2014/12/17 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python3中sys.argv的实例用法
2020/04/24 Python
设计部经理的岗位职责
2013/11/16 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
房地产项目策划书
2014/02/05 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
六一儿童节开幕词
2015/01/29 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书