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 相关文章推荐
juqery 学习之四 筛选查找
Nov 30 Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
深入学习js瀑布流布局
Oct 14 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
Mar 10 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
微信小程序实现一个简单swiper代码实例
Dec 30 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
javascript 内存模型实例详解
Apr 18 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 操作调试的方法
2012/07/12 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
javascript call和apply方法
2008/11/24 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python实现中值滤波去噪方式
2019/12/18 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
客户代表自我评价范例
2013/09/24 职场文书
个人课题方案
2014/05/08 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
关于长城的导游词
2015/01/30 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python