简单分析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 XML实现两级级联下拉列表
Nov 10 Javascript
event对象的方法 兼容多浏览器
Jun 27 Javascript
jquery获取tr并更改tr内容示例代码
Feb 13 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
Jul 14 Javascript
使用重写url机制实现验证码换一张功能
Aug 01 Javascript
Vue.js仿微信聊天窗口展示组件功能
Aug 11 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
原生实现一个react-redux的代码示例
Jun 08 Javascript
原生js实现的移动端可拖动进度条插件功能详解
Aug 15 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
Vue 实现拨打电话操作
Nov 16 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个人网站架设连环讲(三)
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
jquery replace方法去空格
2017/05/08 jQuery
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
深入理解Node module模块
2018/03/26 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
Python yield 使用浅析
2015/05/28 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
python实现大学人员管理系统
2019/10/25 Python
Python pip 常用命令汇总
2020/10/19 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
《植物妈妈有办法》教学反思
2014/02/25 职场文书
《长相思》听课反思
2014/04/10 职场文书
骨干教师考核评语
2014/12/31 职场文书
质检员工作总结2015
2015/04/25 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
python文件目录操作之os模块
2021/05/08 Python
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript