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 相关文章推荐
JS两种定义方式的区别、内部原理
Nov 21 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
javascript中的括号()用法小结
Apr 14 Javascript
在页面加载完成后通过jquery给多个span赋值
May 21 Javascript
jQuery中trigger()方法用法实例
Jan 19 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
JS简单验证上传文件类型的方法
Apr 17 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
Apr 24 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
Apr 24 Javascript
javascript数组的定义及操作实例
Nov 10 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使用file_get_content设置头信息的方法
2016/02/14 PHP
php接口技术实例详解
2016/12/07 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
新手该如何学python怎么学好python?
2008/10/07 Python
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
Pycharm github配置实现过程图解
2020/10/13 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
给儿子的表扬信
2014/01/15 职场文书
小学生期末评语
2014/04/21 职场文书
房屋租赁协议书
2014/10/18 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
入党申请书格式
2019/06/20 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python