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 作用域使用说明
Aug 13 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
May 19 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
基于JavaScript实现验证码功能
Apr 01 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
vue router 组件的高级应用实例代码
Apr 08 Javascript
vue增加强缓存和版本号的实现方法
May 01 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
Sep 11 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变量范围介绍
2012/10/15 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python查询sqlite数据表的方法
2015/05/08 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
pywinauto自动化操作记事本
2019/08/26 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
Python3 集合set入门基础
2020/02/10 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
python collections模块的使用
2020/10/16 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
师范生教师实习自我鉴定
2013/09/27 职场文书
行政文员岗位职责
2013/11/08 职场文书
总经理司机职责
2014/02/02 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
2014年评职称工作总结
2014/11/20 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers