关于This对象

js 中的this 是一个比较难理解的对象;所以也经常作为面试的考点,考察应聘者的js 基础能力;其实this的指向也就那么几种情况,接下来我们一一看一下:

函数中的this取何值是在函数真正被调用时确定的(也就是运行时),函数定义时确定不了

1、在全局调用函数 this 指向 window

var a=10;
function fn(){console.log(this);// widowconsole.log(this.a);//10
}
var foo=document.getElementById('foo');
foo.addEventListener('click',fn);
function fn(){console.log(this); // <div id="foo">click</div>
}
var obj={name:"daxiong",fn:function(){console.log(this);}
};
obj.fn(); // obj
var obj={name:"daxiong",fn:function(){console.log(this);}
};
var f1= obj.fn;
f1(); // window
var obj={name:'daxiong',fn:function(){return function(){console.log(this);}}
};
obj.fn()(); // window
var obj={name:'daxiong',fn:function(){console.log(this); var f1=function(){console.log(this);}f1();}
};
obj.fn();
// obj
// window
var obj={name:'daxiong',fn:function(){console.log(this);var f1=()=>{console.log(this);}f1();}
}
obj.fn();
//obj;
var f2=obj.fn;
f2();
// window
// window
所以说 箭头函数f1的作用域是 obj.fn的作用域;

5、当然也有例外,比如箭头函数中的this,是词法作用域,this 指向定义所在的作用域。

var bar =foo();

4、如果都不是的话,就是默认绑定。在严格模式下,就绑定到 undefined,否则绑定到全局对象。

var bar=obj1.foo();

3、函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 指向那个上下文对象。

var bar =foo.call(obj2);

2、函数是否通过call、apply (显示绑定)?如果是this指向的是指定的对象;

var bar = new foo();

1、函数是否在new 中调用(new绑定)?如果是的话this 绑定的就是新创建的对象。

8、综上所述,我们可以使用下面的规则,对this的指向进行判断:

function foo(){console.log(this.a);
}
var obj={a:1
}
foo.call(obj); //1;

1、call、apply 可以显式绑定;这两个函数的第一个参数是一个对象;他们会把这个对象绑定到this,接着调用函数时指定这个this;

7、显式绑定 改变this的指向

//伪代码;
var new1=function(fn){var newObj=Object.create(fn);fn.call(newObj);return newObj;
};

4、返回这个对象;

3、执行构造函数中的代码(这个函数的调用会绑定到新对象的this);

2、将这个新对象的原型指向 构造函数的 Prototype

1、创建一个新的对象;

我们看一下 new 关键字主要做了哪些事:

6、构造函数中的this 指向创建的实例对象

f1定义的作用域,是obj.fn 的作用域;所以f1 的作用域指向了obj;

箭头函数中this 指向与其他不同,他是在函数定义是就确定了(词法作用域);

5、箭头函数中的This

第一个输出是obj是一位函数在obj中调用了; f1的调用为什么会是window呢:因为他没有绑定到任何一个对象中;

我们在看下这个例子:

在红皮书中有这么一句话:匿名函数的执行环境具有全局性 所以这个输出的是window; 那么为什么呢,其实在这个上下文(执行环境)中匿名函数并没有绑定到任何一个对象中,所以指向了window (非严格模式)

4、匿名函数中的 this 具有全局性

为什么会指向window呢,以为这个函数的指针已经指向了 f1 而f1 的执行环境时 window 所以指向了window;

如果我们做个变形:

3、函数作为对象方法调用时,this就等于那个对象;

这个不难理解;由于DOM元素 调用的他,所以指向了DOM元素

2、DOM事件中的this 指向DOM节点

因为函数是在全局调用的,所以this 指向 window;

js 上下箭头滚动_JS中的this完全讲解,再也不会被this搞晕了相关推荐

  1. js 多个定时器_JS中的同步/异步编程

    1. 进程(process)/线程(thread) 进程process: 电脑端安装很多的应用软件,每当运行一个应用程序,相当于开辟一个进程(而对于浏览器来说,每新建一个页卡访问一个页面,都是新开辟一 ...

  2. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

  3. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧

    json:JavaScript 对象表示法(javascript Object Notation),其实JSON就是一个javaScript的对象(Object)而已. 如有不清楚JSON,可以去w3 ...

  4. js 浅拷贝直接赋值_JS中的赋值、浅拷贝与深拷贝

    作者:奚杰 拷贝是写代码中经常使用的方法.浅拷贝与深拷贝是指拷贝的两种情况.本文将深入探究JS的赋值.浅拷贝与深拷贝. 数据类型 在探究深拷贝与浅拷贝之前,我们先梳理一下JS的数据类型.在JavaSc ...

  5. java数组 js数组的长度_js中split()方法得到的数组长度问题

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) 参数 描述 separator 必需.字符串或正则 ...

  6. js map 箭头_JS异常函数之箭头函数

    来源:logrocket作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函数 ...

  7. js map 箭头_JS异常函数之-箭头函数

    来源:logrocket 作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函 ...

  8. stellar.js_使用Stellar.js创建视差滚动网站

    stellar.js 最近的现代网页设计的最大趋势之一是使用视差滚动效果. 在本教程中,我将向您展示如何在自己的网站上创建效果,并需要一点想象力,并需要Stellar.js的帮助. 现代视差jQuer ...

  9. 前端知识点总结——JS高级(持续更新中)

    前端知识点总结--JS高级(持续更新中) 1.字符串 什么是: 连续存储多个字符的字符数组 相同: 1. 下标 2. .length 3. 遍历 4. 选取: slice(starti[, endi] ...

最新文章

  1. Autoware安装和快速使用
  2. Dubbo 源码分析 - 集群容错之 Cluster
  3. 哥伦比亚大学的材料更新提交窗口!干货!
  4. python 文件操作练习
  5. 利用输入输出流及文件类编写一个程序,可以实现在屏幕显示文本文件的功能,类似DOS命令中的type命令
  6. Android Binder通信机制
  7. 3801.最佳连续子数组-AcWing题库
  8. 文件搜索工具Listary中文版快速上手使用教程
  9. Win11绿色护眼模式怎么开启
  10. layui搭建后台管理页
  11. 铁血战士之异形大战铁血战士2 观感
  12. Log4j 漏洞修复检测 附检测工具
  13. 【DBSDFZOJ 4370】小宁的机器人(模拟)
  14. 计算生活中常见的Π值
  15. 关于大脑记忆可视化的初步尝试(一)
  16. 硬核讲解 Jetpack 之 LifeCycle 使用篇
  17. Java设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆,计算面积,,并写程序验证计算一个点(Point对象)是否在圆(Cricle对象)内
  18. 推荐几个免费看动漫的网站
  19. Rocketmq同项目多个生产者多个消费者问题
  20. Batch Normalization 批归一化是什么? 有什么用?

热门文章

  1. 一个技术管理者的苦逼【技术管理漫谈】
  2. 自动化流程开源框架BotSharp
  3. ASP.NET Core 运行原理解剖[1]:Hosting
  4. 体验 PHP under .NET Core
  5. OSS.Common获取枚举字典列表标准库支持
  6. css 实现章节名称不换行,多余部分用 ... 代替
  7. WCF服务自托管(Self-Hosting)
  8. 【ArcGIS遇上Python】Python实现Modis NDVI批量化月最大合成
  9. C语言试题四十四之移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。
  10. C和指针之动态内存分配之输入很多整数进行排序