JavaScript中的this原理及6种常见使用场景详解


Posted in Javascript onFebruary 14, 2020

JavaScript中的this原理及6种常见使用场景详解

一、this原理

this是JavaScript的一个关键字,函数调用时才会出现;
因为函数是在一定的环境中运行的,调用函数时肯定需要知道是[谁调用的]?就用到了this进行指向;
那么this到底指向的是什么?
this 既不指向函数自身,也不指函数的词法作用域,而是调用函数时的对象!

二、使用场景

(一)普通函数的调用,this指向的是Window

var name = '卡卡';
function cat(){
  var name = '有鱼';
  console.log(this.name);//卡卡
  console.log(this);//Window {frames: Window, postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, …}
}
cat();

这里大家可能有疑问,不是说this指向的是调用函数的对象吗?cat()并没有对象出现啊,这个是因为在全局作用域中,window是根目录,一般可以省略,例如:alert()其实是 window.alert();

(二)对象的方法,this指的是该对象

1、一层作用域链时,this指的该对象

var name = '卡卡';
var cat = {
  name:'有鱼',
  eat:function(){
    console.log(this.name);//有鱼
  }
}
cat.eat();

因为函数eat是由cat对象调用的,所以this指向的是cat本身,所以cat.name=有鱼;

2、多层作用域链时,this指的是距离方法最近的一层对象

var name = '卡卡';
var cat = {
  name:'有鱼',
  eat1:{
    name:'年年',
    eat2:function(){
      console.log(this.name);//年年
    }
  }
}
cat.eat1.eat2();

eat2方法包含在两个对象cat、eat1中,但是紧挨着的eat1对象,所以this.name指的是eat1的属性name,即[年年]

这里需要注意一个情况,如果cat.eat1.eat2这个结果赋值给一个变量eat3,则eat3()的值是多少呢?

var eat3 = cat.eat1.eat2;
eat3(); // 卡卡

答案是[卡卡],这个是因为经过赋值操作时,并未发起函数调用,eat3()这个才是真正的调用,而发起这个调用的是根对象window,所以this指的就是window,this.name=卡卡

JavaScript中的this原理及6种常见使用场景详解

(三)构造函数的调用,this指的是实例化的新对象

var name = '卡卡';
function Cat(){
  this.name = '有鱼';
  this.type = '英短蓝猫';
}
var cat1 = new Cat();
console.log(cat1);// 实例化新对象 Cat {name: "有鱼", type: "英短蓝猫"}
console.log(cat1.name);// 有鱼

(四)apply和call调用时,this指向参数中的对象

var name = '有鱼';
function eat(){
  console.log(this.name);
}
var cat = {
  name:'年年',
}
var dog = {
  name:'高飞',
}

eat.call(cat);// 年年
eat.call(dog);// 高飞

apply方法和call方法相当于改变了显式的修改了prototype原型

JavaScript中的this原理及6种常见使用场景详解

(五)匿名函数调用,指向的是全局对象

var name = '卡卡';
var cat = {
  name:'有鱼',
  eat:(function(){
    console.log(this.name);//卡卡
  })()
}
cat.eat;

这里提一下匿名函数调用方式,常用的有三种方法:

//①先用()包起来,然后再后面跟 (参数) 
(function(data){
  console.log(data);
})("222");

//②先后面跟(参数),然后再()包起来
(function(data){
  console.log(data);
}("333"));

//③正常函数格式,前面加 !
!function(data){
  console.log(data);
}("444");

(六)定时器中调用,指向的是全局变量
常用的定时器有setInterval和setTimeout,拿setInterval举例子:

var name = '卡卡';
var cat = setInterval(function(){
  var name = '有鱼';
  console.log(this.name);// 卡卡
  clearInterval(cat);
},500);

其实定时器的本质,也是一种匿名函数的形式。

总结:
①普通函数的调用,this指向的是window
②对象方法的调用,this指的是该对象,且是最近的对象
③构造函数的调用,this指的是实例化的新对象
④apply和call调用,this指向参数中的对象
⑤匿名函数的调用,this指向的是全局对象window
⑥定时器中的调用,this指向的是全局变量window

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype中dom对象方法汇总
Sep 17 Javascript
JS读取cookies信息(记录用户名)
Jan 10 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
理解javascript正则表达式
Mar 08 Javascript
angular实现图片懒加载实例代码
Jun 08 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
javascript中的隐式调用
Feb 10 Javascript
js运算符的一些特殊用法
Jul 29 Javascript
如何手动实现es5中的bind方法详解
Dec 07 Javascript
Three.JS实现三维场景
Dec 30 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
Feb 14 #Javascript
Angular之jwt令牌身份验证的实现
Feb 14 #Javascript
node.js中module模块的功能理解与用法实例分析
Feb 14 #Javascript
JS实现简易计算器
Feb 14 #Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 #Javascript
node.js中npm包管理工具用法分析
Feb 14 #Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 #Javascript
You might like
php购物车实现方法
2015/01/03 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
python制作企业邮箱的爆破脚本
2016/10/05 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
详解Python的三种拷贝方式
2020/02/11 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
思想政治自我鉴定
2013/10/06 职场文书
问卷调查计划书
2014/01/10 职场文书
施工材料员岗位职责
2014/02/12 职场文书
环卫工人慰问信
2015/02/15 职场文书
运动会报道稿大全
2015/07/23 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技