简单分析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 相关文章推荐
Div Select挡住的解决办法
Aug 07 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
jquery获得keycode的示例代码
Dec 30 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
May 11 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 Javascript
jquery解析XML及获取XML节点名称的实现代码
May 18 Javascript
Bootstrap使用基础教程详解
Sep 05 Javascript
node.js中使用Export和Import的方法
Sep 18 Javascript
一个基于react的图片裁剪组件示例
Apr 18 Javascript
Vue实现点击时间获取时间段查询功能
Aug 21 Javascript
vue 优化CDN加速的方法示例
Sep 19 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 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下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
详解vue axios中文文档
2017/09/12 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python将unicode转为str的方法
2017/06/21 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Python中无限循环需要什么条件
2020/05/27 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
索尼巴西商店:Sony巴西
2019/06/21 全球购物
学校门卫工作职责
2013/12/07 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
爱心活动计划书
2014/04/26 职场文书
2014年班组工作总结
2014/11/20 职场文书
人力资源部岗位职责
2015/02/11 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
Python基本的内置数据类型及使用方法
2022/04/13 Python
java实现面板之间切换功能
2022/06/10 Java/Android
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL