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 相关文章推荐
javascript Prototype 对象扩展
May 15 Javascript
js 获取和设置css3 属性值的实现方法
May 06 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
Sep 09 Javascript
简介JavaScript中Math.LOG10E属性的使用
Jun 14 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
Nov 20 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
layer扩展打开/关闭动画的方法
Sep 23 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 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
我的论坛源代码(五)
2006/10/09 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
phpStorm2020 注册码
2020/09/17 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
javascript new后的constructor属性
2010/08/05 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
python实现的文件同步服务器实例
2015/06/02 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
在线课程:Skillshare
2019/04/02 全球购物
党员岗位承诺口号大全
2014/03/28 职场文书
法人授权委托书
2014/04/03 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS