简单分析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开发包大全整理
Dec 22 Javascript
SUN的《AJAX与J2EE》全文译了
Feb 23 Javascript
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
Nov 03 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
Apr 13 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
微信小程序 wx:for遍历循环使用实例解析
Sep 09 Javascript
layui输入框只允许输入中文且判断长度的例子
Sep 18 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
Apr 08 Javascript
vue3不同环境下实现配置代理
May 25 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类
2006/11/25 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php实现mysql封装类示例
2014/05/07 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
JS 控件事件小结
2012/10/31 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
js单词形式的运算符
2014/05/06 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
详解django三种文件下载方式
2018/04/06 Python
django中模板的html自动转意方法
2018/05/27 Python
python实现机器学习之多元线性回归
2018/09/06 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
计算机应用与科学个人的自我评价
2013/11/15 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android