简单分析js中的this的原理


Posted in Javascript onAugust 31, 2019

很多人可能会有疑问,this到底是什么?为什么this的值变化多端?

首先我们来概括下this.

this是一个对象,一般存在于函数中,表示当前函数的执行上下文;

值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容

接下来我们看看在不同场景下的this的指向

1.函数默认执行 :此时this指向Window

function fn(){
  console.log(this)
//Window
 };
fn();

在严格模式开启后,this的指向又有所不同

严格模式下 : this指向undefined

function fn(){
  "use strict"
  console.log(this)
//undefined
 };
 fn();

2.函数的隐式执行 : this指向函数的直接执行对象

function fn(){
    console.log(this);

   };
   var a = 10;
   var obj = {
    a:20,
    b:fn
   };
   obj.b();



//this指向obj
  var obj2 = {
    a:30,
    b:obj.b
   };
   obj2.b();


 //this指向obj2
  var obj3 = {
    a:40,
   b:obj2




  };
  obj3.b.b();


//obj3.b.b等价于obj2.b this指向obj2

但当函数作为参数传到另一个函数的变量时, 发生隐式丢失,this指向Window

function fn(){
   console.log(this)  //Window
  };
  var obj = {
   a:20,
   b:fn
  };
 setTimeout(obj.b, 1000);
  function setTimeout(cb,t){
   cb();   
 //obj.b作为参数传给cb,而cb前没对象,相当于默认方式执行fn() 
  };

3.函数的显式执行 : this指向指定对象

我们可以通过函数的bind、call、apply方式指定this的对象,还可以用来修复上文中的隐式丢失

var obj = {
  name: "obj",
  show: function () {
   console.log(this.name)
  }
 }
 obj.show();      //obj

 var obj2 = {
  name: "obj2"
 };
 obj.show.bind(obj2)();   //obj2

 var name = "蜡笔笑嘻嘻";   
 obj.show.bind(window)();  //Window

4.构造函数执行(通过new执行)

构造函数中的this 会指向创建出来的实例对象

function Person() {
  this.name = 'zhar';
 }
 var p = new Person();
 console.log(p.name);  //zhar

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

Javascript 相关文章推荐
浅谈jQuery中setInterval()方法
Jul 07 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
Bootstrap轮播图学习使用
Feb 10 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
Node.js笔记之process模块解读
May 31 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
Dec 04 Javascript
微信小程序的tab选项卡的实现效果
May 15 Javascript
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
微信小程序image图片加载完成监听
Aug 31 #Javascript
JS实现使用POST方式发送请求
Aug 30 #Javascript
node.js处理前端提交的GET请求
Aug 30 #Javascript
Node.js系列之连接DB的方法(3)
Aug 30 #Javascript
Node.js系列之发起get/post请求(2)
Aug 30 #Javascript
Node.js系列之安装配置与基本使用(1)
Aug 30 #Javascript
微信小程序实现写入读取缓存详解
Aug 30 #Javascript
You might like
PHP生成Flash动画的实现代码
2010/03/12 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
js实现验证码功能
2020/07/24 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python面向对象编程基础解析(一)
2017/10/26 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
python框架中flask知识点总结
2018/08/17 Python
python机器学习之神经网络实现
2018/10/13 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
对python的输出和输出格式详解
2018/12/08 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Python __slots__的使用方法
2020/11/15 Python
客户经理岗位职责
2013/12/08 职场文书
生物学专业求职信
2014/07/23 职场文书
社区创先争优承诺书
2014/08/30 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
同意转租证明
2015/06/24 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
python函数的两种嵌套方法使用
2022/04/02 Python