深入理解JS各种this指向问题
说到this,入前端坑的人都知道这是JS初期语言毕竟之路。很多人(我就是)对于this的了解很模糊,或者不够全面。最近打算在反过来在看下es6,在es6中又出现了箭头函数对于this的理解有多了层认识。所以就在写一遍来加强自己的认知。
在讲this之前,我们先把作用域链在复习一下
在红宝书中对作用域链的描述有这么一句话:当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问
简单来说,作用域链的作用就是在函数使用一个变量的时候,由近到远的查找有自身内部想最顶层也就是window的作用域中查找。
我们作用域链明白了,我们讲一下this.
this又分传统this和箭头函数中的this
传统this的指向:
1.this总是指向它的直接调用者。
2.在非严格模式下当没有调用者的时候,默认指向最顶层也就是window
3.在严格模式下('use strict')当没有调用者的时候,this就是undefined
4.在call、apply、bind绑定的时候,默认指向绑定的对象
箭头函数中this的指向:
1.箭头函数自身不包含this,它是继承与他所处的宿主对象的this。
光写概念,不说看得烦,我敲得也烦。直接上代码吧。
实例一:this指向它的直接调用者
var myObj = {
myVal : 3,
myFnc : function(){
console.log(this);
}
}
myObj.myFnc();//myobj
此时myObj调用了所以this指向于myObj;
实例二:非严格模式下没有调用者的时候
function myFnc(){
console.log(this);
}
myFnc();//window
此时,因为没有调用者,所以this默认指向最顶层也就是window
实例三:严格模式下没有调用者的时候
function myFnc(){
'use strict'
console.log(this);
}
myFnc() //undefined
此时,没有调用者,又因为当前是严格模式所以打印出来的this是undefined
实例四:call、apply、bind绑定的时候function myFnc1(){
function myFuc1(){
console.log(this);
}
function myFnc2(a,b){
console.log(this);
}
myFnc2.call(myFnc1);//myFnc1
此时绑定的就是myFnc1,所以当前this的指向就是myFnc1;
call和apply的绑定机制大致是一样的,所以就不一一解释了。
var myObj = {
myFnc :function(){
setTimtout(function(){
console.log(this);
}.bind(this))
}
}
myObj.myFnc();//myObj
因为在定时器函数中,没有调用者,所以默认指向window。又因为使用bind()方法给回调函数直接绑定了当前this指向,所以当前this指向就是myObj。
是不是感觉这么写很麻烦,当今的ES6的年代,还用啥bind绑定。如果需要返回当前函数伸手就是一个箭头函数
实例五:箭头函数简易版
var myObj = {
myFnc :function(){
setTimeout(() => {
console.log(this)
})
}
}
myObj.myFnc();
因为箭头函数继承的是它的宿主对象的this,也就是继承的myFnc的this,而myFnc的This指向是myObj,所以打印出来的当前this指向就是myObj;
实例六:箭头函数嵌套版
var myObj = {
myFnc :function(){
function childFnc(){
setTimeout(() => {
console.log(this)
})
}
childFnc();
}
}
myObj.myFnc();
小小的思考一下。。。
如果你一瞬间就明白的话,那就表明你已经通关了。
由里到外的分析,你就会发现很简单。
因为箭头函数,当前this继承于它的宿主也就是childFnc。childFnc方法的执行,因为没有调用者。所以它的this指向的是window。所以当前打印的this指向就是window。
总结:
this指向简单的说就是谁调用就指向谁,没调用就指向window(严格模式undefined)
当出现箭头函数内的,就指向宿主元素。
深入理解JS各种this指向问题的更多相关文章
- 如何理解JS中this指向的问题
首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的 ...
- 关于js中this指向的理解总结!
关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 ...
- 简单理解js的this
js的this是什么?关于这个东西,博客园里面有太多的解释了,不过,本人看了一下,感觉对this解释的有点复杂了,因此,本人在此给this一个简单易于理解的定义. this其实是js的一个对象,至于是 ...
- 从一个简单例子来理解js引用类型指针的工作方式
<script> var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined conso ...
- 我这样理解js里的this
关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...
- 深入理解js——prototype原型
之前(深入理解js--一切皆是对象)中说道,函数也是一种对象.它也是属性的集合,你也可以对函数进行自定义属性.而JavaScript默认的给了函数一个属性--prototype(原型).每个函数都有一 ...
- 理解JS闭包
从事web开发工作,尤其主要是做服务器端开发的,难免会对客户端语言JavaScript一些概念有些似懂非懂的,甚至仅停留在实现功能的层面上,接下来的文章,是记录我对JavaScript的一些概念的理解 ...
- 全面理解js面向对象
前言 当今 JavaScript 大行其道,各种应用对其依赖日深.web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学 ...
- JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
前 言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...
随机推荐
- VSAM:视频监控系统 A System for Video Surveillance and Monitoring
VSAM(VideoSurveillance and Monitoring)视频监控系统 Robotics Institute CMU 1:引言 2:试验床介绍 3:基本的视频分析算法:运动目标检测, ...
- ibatis中:org.springframework.jdbc.UncategorizedSQLException:异常
SQL 查询语句异常,可能是你的查询语句写错了,或者是你的映射的类和或数据中与表不对应,检查你的映射配置文件.
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) A 水 B stl C stl D 暴力 E 树状数组
A. Unimodal Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Square Country
原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1073 分析:dp,dp[i]表示钱为i且恰好用完时能买的最少土地数,易知dp[i]=mi ...
- STL源码分析-function
http://note.youdao.com/noteshare?id=269e16541b43095eaf97636d4e046b1d
- 前端PHP入门-020-重点日期函数之获取时期时间信息函数
你需要知道关于时间的几个概念: 时区/世界时/unix时间戳 1.时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的. 1884年在华盛顿召开国际 ...
- 关于 Capella 需要纠正的语音
li { font-size: 18px; } 关于 Capella 需要纠正的语音 持续更新 浊塞音声带要振动 区分 [θ]/[ð] 和 [t̪],注意舌位 [ɫ] 的舌位,切记不能圆唇 [æ] 的 ...
- IIC总线学习
IIC总线 IIC协议简要说明: 1.2条双向串行线,一条数据线称为SDA,一条时钟线SCL,双向半双工 2.传输的设备之间只是简单的主从关系,主机可以作为主机发送也可以作为主机接收,任何时候只能由一 ...
- 无废话JavaScript(上)
<程序员>2008.09期有一篇名为<无废话ErLang>的文章,这让我想到了许多的诸如“无废话C”.“无废话书评”这类的文章,也想到了JavaScript可没有一篇“无废话” ...
- 【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2
[题意]数列满足an=an-1+an-2,n>=3.现在a1=i,a2=[l,r],要求满足ak%p=m的整数a2有多少个.10^18. [算法]数论(扩欧)+矩阵快速幂 [题解]定义fib(i ...