彻底搞懂js this指向问题
在这里必须要提一句的是,this指向是学习js必须要掌握的(必须),再开始之前先看底部的总结,然后回上面看例子便一目了然。
例子1:
function a(){
var user = "TangSir";
console.log(this.user); //undefined
console.log(this); //Window
}
a();
看总结第2条,这里函数本身没有被父级对象调用,那么这里就指向window
function a(){
var user = "TangSir";
console.log(this.user); //undefined
console.log(this); //Window
}
window.a();
可以发现是一样的,这是因为window是全局对象,这里的a是被window点出来的,所以指向window(在这里也可以把window理解为a的父级,那么就是总结第3条)
例子2:
var o = {
user:"TangSir",
fn:function(){
console.log(this.user); //TangSir
}
}
o.fn();
这里的this指向o(总结第3条)
var o = {
user:"TangSir",
fn:function(){
console.log(this.user); //TangSir
}
}
window.o.fn();
这里加了个window,但是fn的父级还是o,是o调用了它(总结第3条)
var o = {
a:12,
b:{
a:14,
fn:function(){
console.log(this.a); //14
}
}
}
o.b.fn();
这里父级是b,那么this指向b(总结第3条)
例子3:
var o = {
a:12,
b:{
a:14,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();
这里为何是undefined而不是14?是谁最后调用了它,这里是j(),那么this只能是window(总结第1条)
例子4:
function Fn(){
this.user = "TangSir";
}
var a = new Fn();
console.log(a.user); //TangSir
构造函数的this指向函数实例本身,这里赋给了a,等于赋值了一份给了a,那么a.user肯定也是TangSir(总结第5条)
例子5:
function Fn()
{
this.user = 'TangSir';
return {};
}
var a = new Fn();
console.log(a.user); //undefined
因为返回的是对象,所以this指向该对象,所有是undefined(总结第6条)
function Fn()
{
this.user = 'TangSir';
return function(){};
}
var a = new Fn();
console.log(a.user); //undefined
function同样是对象,所以this指向该对象,所有是undefined(总结第6条)
function Fn()
{
this.user = 'TangSir';
return 1;
}
var a = new Fn();
console.log(a.user); //TangSir
这里this指向函数实例本身,所以是TangSir(总结第6条)
function Fn()
{
this.user = 'TangSir';
return undefined;
}
var a = new Fn();
console.log(a.user); //TangSir
这里this指向函数实例本身,所以是TangSir(总结第6条)
function Fn()
{
this.user = 'TangSir';
return null;
}
var a = new Fn();
console.log(a.user); //TangSir
函数里有null比较特殊,这里this指向函数实例本身,所以是TangSir(总结第6条)
例子6:
var obj = {
name:"TangSir",
fn:function(){
fn1=()=>{
console.log(this.name); //TangSir
}
fn1();
}
}
obj.fn();
这里箭头函数父级是fn,去掉父级后,fn1()此时的父级就是obj,那么this.name自然是TangSir(总结第6条和第3条)
例子7:
var o = {
a:12,
b:{
a:14,
c:{
a:15,
d:function(){
console.log(this.a); //15
function e(){
console.log(this.a); //undefined
f();
}
e();
function f(){
console.log(this.a); //undefined
}
g=()=>{
console.log(this.a); //15
}
g();
}
}
}
}
o.b.c.d();
这里第一个console是15(总结4),第二和第三个console是undefined,不然理解,它们的调用时f()和e(),所以是undefined,第三个是箭头函数,根据例子6结合总结第7条,得出15
总结:
1、this在函数定义的时候是没办法确定指向的,只有函数执行的时候,最后谁调用了它才能确定this指向谁
2、如果函数中有this,但是函数本身没有被父级(上一级)对象调用,那么就指向window
3、如果函数中有this,且函数本身被父级(上一级)对象调用,那么this就指向上一级对象
4、如果函数中有this,且函数中有多个对象,尽管函数被最外层对象调用,但this仍然指向父级(上一级)对象
5、构造函数中this,指向构造函数实例,如果创建的实例赋给对象,那么等于复制了一份给对象,该对象也拥有实例中的this(new出来的构造函数可以改变this指向)
6、构造函数中带return,返回值若是对象,this指向的是那个返回的对象,返回值若是null,this还是指向那个构造函数实例
7、es6中=>箭头函数中的this,去掉当前函数的父级(上一级)对象,再看this指向谁,此时指向谁就是谁(结合第3条)
彻底搞懂js this指向问题的更多相关文章
- 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- 让你彻底搞懂JS中复杂运算符==
让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...
- 彻底搞懂 JS 中 this 机制
彻底搞懂 JS 中 this 机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 目录 this 是什么 this 的四种绑定规 ...
- 一文搞懂 js 中的各种 for 循环的不同之处
一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...
- 彻底搞懂js __proto__ prototype constructor
在开始之前,必须要知道的是:对象具有__proto__.constructor(函数也是对象固也具有以上)属性,而函数独有prototype 在博客园看到一张图分析到位很彻底,这里共享: 刚开始看这图 ...
- 通过一张简单的图,让你彻底地搞懂JS的==运算
大家知道,JavaScript中的==是一种比较复杂运算,它的运算规则很奇怪,很容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读ECMAScript规范的基础上,我画了一 ...
- 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?
晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...
- 一文彻底搞懂JS前端5大模块化规范及其区别
码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14577243.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...
- Spirit带你彻底搞懂JS的6种继承方案
JavaScript中实现继承的6种方案 01-原型链的继承方案 function Person(){ this.name="czx"; } function Student(){ ...
随机推荐
- 第05组 Alpha冲刺 (3/6)(组长)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- JavaScript封装一个函数效果类似内置方法concat()
JavaScript封装一个函数效果类似内置方法concat() 首先回忆concat()的作用: concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个 ...
- linux之DHCP服务
1.DHCP介绍(动态主机配置协议) DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议, 主要用途:给内部网络或网络服务供应 ...
- 老板让只懂Java基本语法的我,基于AQS实现一个锁
10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...
- Python pip下载过慢解决方案
pip是一个python的包安装与管理工具,安装python时候可以选择是否安装,如果安装了pip可以使用命令查看版本 C:\Users\Vincente λ pip -V pip 19.2.3 fr ...
- 12种不宜使用的Javascript语法 ---阮一峰
原文链接-阮一峰博客 1. == Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前一组,永远只 ...
- 单线程的Redis有哪些慢动作?
持续原创输出,点击上方蓝字关注我 目录 前言 为什么 Redis 这么火? 键和值的保存形式? 为什么哈希表操作变慢了? 集合的操作效率? 有哪些数据结构? 不同操作的复杂度? 总结 前言 现在一提到 ...
- PHP一些不一样的思路
大多数来自p牛 SQL注入(left join) 源代码 <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_se ...
- [原题复现+审计][CISCN2019 华北赛区 Day1 Web2]ikun(逻辑漏洞、JWT伪造、python序列化)
简介 原题复现: 考察知识点:逻辑漏洞.JWT伪造.python反序列化 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台 ...
- webug第十六关:明天双十一
---恢复内容开始--- 第十六关:明天双十一 不说了...只能看着源码做出来 ---恢复内容结束---