简单分析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 匿名函数的理解(透彻版)
Jan 28 Javascript
javascript 拖动表格行实现代码
May 05 Javascript
jquery实现动态操作select选中
Feb 11 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
Node.js模块封装及使用方法
Mar 06 Javascript
Vue.js教程之axios与网络传输的学习实践
Apr 29 Javascript
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
JS实现简单省市二级联动
Nov 27 Javascript
jQuery实现html可联动的百分比进度条
Mar 26 jQuery
linux服务器快速卸载安装node环境(简单上手)
Feb 22 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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
javascript实现数独解法
2015/03/14 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
python人人网登录应用实例
2014/09/26 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Python中datetime常用时间处理方法
2015/06/15 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
python pygame实现2048游戏
2018/11/20 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
抽象方法、抽象类怎样声明
2014/10/25 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
文明城市标语
2014/06/16 职场文书
拖欠货款起诉状
2015/05/20 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL