简单分析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 相关文章推荐
JS基础之undefined与null的区别分析
Aug 08 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
JavaScript静态类型检查工具FLOW简介
Jan 06 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
Jan 16 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
vue 路由嵌套高亮问题的解决方法
May 17 Javascript
Vue 中axios配置实例详解
Jul 27 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 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
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
mongodb和php的用法详解
2019/03/25 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
pycharm永久激活超详细教程
2020/10/29 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
安全资料员岗位职责
2013/12/14 职场文书
师德模范事迹材料
2014/06/03 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
2015年招聘工作总结
2014/12/12 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书