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 相关文章推荐
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
Mar 25 Javascript
location对象的属性和方法应用(解析URL)
Apr 12 Javascript
jQuery实现div浮动层跟随页面滚动效果
Feb 11 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 06 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
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
DOM相关内容速查手册
2007/02/07 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
json的使用小结
2016/06/08 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
Python递归函数定义与用法示例
2017/06/02 Python
python调用摄像头拍摄数据集
2019/06/01 Python
pandas中的series数据类型详解
2019/07/06 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Python实现一个论文下载器的过程
2021/01/18 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
土木工程专业自荐信
2013/10/04 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
中国合伙人观后感
2015/06/02 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS