简单分析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 写的一个简单的timer
Jul 30 Javascript
基于JavaScript创建动态Dom
Dec 08 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
JS实现星星评分功能实例代码(两种方法)
Jun 09 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
jquery animate动画持续运动的实例
Nov 29 jQuery
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
Aug 14 Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
Vue header组件开发详解
2018/01/26 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
Python引用模块和查找模块路径
2016/03/17 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
python自动化报告的输出用例详解
2018/05/30 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
学生生病请假条范文
2014/02/16 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
音乐剧猫观后感
2015/06/04 职场文书
关于运动会的广播稿
2015/08/19 职场文书
教师岗位说明书
2015/09/30 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL
Redis基本数据类型String常用操作命令
2022/06/01 Redis