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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
jQuery+PHP星级评分实现方法
Oct 02 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
解析如何利用iframe标签以及js制作时钟
Dec 08 Javascript
Javascript中 toFixed四舍六入方法
Aug 21 Javascript
使用store来优化React组件的方法
Oct 23 Javascript
angularjs结合html5实现拖拽功能
Jun 25 Javascript
javascript中的闭包概念与用法实践分析
Jul 26 Javascript
微信小程序wx.request的简单封装
Nov 13 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 Javascript
JavaScript实现点击切换验证码及校验
Jan 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
一个php作的文本留言本的例子(一)
2006/10/09 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
档案室主任岗位职责
2014/02/12 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
党员个人整改措施
2014/10/24 职场文书