简单分析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 相关文章推荐
javascript 复杂的嵌套环境中输出单引号和双引号
May 26 Javascript
用jquery和json从后台获得数据集的代码
Nov 07 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
jQuery on方法传递参数示例
Dec 09 Javascript
jQuery实现的简单提示信息插件
Dec 08 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
Apr 09 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
May 24 Javascript
js实现登录拖拽窗口
Feb 10 Javascript
微信小程序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实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
jquery 表单取值常用代码
2009/12/22 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
python调用新浪微博API项目实践
2014/07/28 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
python3.7调试的实例方法
2020/07/21 Python
pycharm永久激活超详细教程
2020/10/29 Python
Python如何telnet到网络设备
2021/02/18 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
中科创达面试题
2016/12/28 面试题
网站设计师的岗位职责
2013/11/21 职场文书
护士毕业实习感言
2014/03/05 职场文书
采购部长岗位职责
2014/06/13 职场文书
离婚案件答辩状
2015/05/22 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
HTML+JS实现在线朗读器
2022/02/15 Javascript