简单分析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 表格工具集
Apr 25 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 Javascript
js继承的实现代码
Aug 05 Javascript
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
使用js写的一个简易的投票
Nov 27 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
Jan 26 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
史上最全JavaScript常用的简写技巧(推荐)
Aug 17 Javascript
vue 粒子特效的示例代码
Sep 19 Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 Javascript
vue实现移动端触屏拖拽功能
Aug 21 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
基于Python函数和变量名解析
2019/07/19 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
有个性的自我评价范文
2013/11/15 职场文书
学校元旦晚会方案
2014/02/19 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
大学生求职信例文
2014/06/29 职场文书
荆州古城导游词
2015/02/06 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
工作表现证明
2015/06/15 职场文书
高三教师工作总结2015
2015/07/21 职场文书
springboot用户数据修改的详细实现
2022/04/06 Java/Android