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 相关文章推荐
ASP.NET中基于JQUERY的高性能的TreeView补充
Feb 23 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
JavaScript中诡异的delete操作符
Mar 12 Javascript
AngularJS基础 ng-csp 指令详解
Aug 01 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 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简单实现快速排序的方法
2015/04/04 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JS回调函数的应用简单实例
2014/09/17 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
javascript控制台详解
2015/06/25 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
pyside写ui界面入门示例
2014/01/22 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
在django中,关于session的通用设置方法
2019/08/06 Python
PyTorch中permute的用法详解
2019/12/30 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
先进个人事迹材料
2014/12/29 职场文书
五一放假通知怎么写
2015/08/18 职场文书
GO中sync包自由控制并发示例详解
2022/08/05 Golang