js this工作原理
js中的this是个很妙的东西,你经常不知道它到底在指向谁,又是谁在调用它。
通用判断方法:
1.this总是指向它的直接调用者
- var a={
- user:'Artimis',
- fn:function(){
- console.log(this.user)
- }
- }
- a.fn() //Artimis => this指向a
- var b=a.fn;
- b() //undefined => this指向window
2.如果没有找到直接调用者,则this指向window
- function fn(){
- var user='Artimis';
- console.log(this.user)
- }
- fn() //undefined => this指向window
3.遇到return,如果返回的是对象,则this指向返回对象,否则指向函数实例
- function A(){
- this.user='Artimis';
- return {} //return一个空对象
- }
- var a=new A();
- console.log(a.user) //undefined => this指向return的{}
- function B(){
- this.user='Artimis';
- return 1 //return一个数值
- }
- var b=new B();
- console.log(b.user) //Artimis => this指向b
4.使用call/apply/bind绑定的,this指向绑定对象
5.定时器(匿名函数)内没有默认的宿主对象,所以this指向window
6.箭头函数内部没有this,this指向外层最近的调用者
1> 箭头函数在调用时,不会生成自身作用域下的this和arguments
2> 不像普通函数一样在调用时自动获取this,而是沿着作用域链向上查找,找到最近的外部一层作用域的this,并获取
3> 在定义对象的方法/具有动态上下文的回调函数/构造函数中都不适用
改变this指针指向:
1.new操作符
new会创造一个对象实例,这个实例继承了new操作符右边的对象,因此在调用方法时,this会指向对象实例
- function A(){
- this.user='Artimis'
- }
- var a=new A();
- console.log(a.user) //Artimis => this指向a
.call/apply/bind
call和apply主要用于指定this的环境变量,第一个参数是什么,this就指向什么,如果是null,则指向window
- var a={
- user:'Artimis',
- fn:function(){
- console.log(this.user)
- }
- }
- var b=a.fn;
b() //undefined- b.call(a) //Artimis => this指向a
- b.call(null) //undefined => this指向window
bind是延迟的,会返回一个修改后的函数,可以自行决定执行的时间
- var a={
- user:'Artimis',
- fn:function(){
- console.log(this.user)
- }
- }
- var b=a.fn;
- var c=b.bind(a)
- c() //Artimis => 延迟执行,自定义执行时间
- var a={
- fn:function(x,y){
- console.log(x+y)
- }
- }
- var b=a.fn;
- var c=b.bind(a,2) //自定义参数x
- c(3) //
js this工作原理的更多相关文章
- 探索JS引擎工作原理
JavaScript 从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习 JS 引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用 ...
- 分享-结合demo讲解JS引擎工作原理
代码如下: var x = 1; function A(y){ var x = 2; function B(z){ console.log(x+y+z); } return B; } var C = ...
- node.js基本工作原理及流程
概述 Node.js是什么 Node 是一个服务器端 JavaScript 解释器,用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非 ...
- 探索JS引擎工作原理 (转)
这篇文章从相对底层的角度介绍了js引擎的工作 引入了 静态作用域 执行环境上下文(context) 等概念 , http://www.cnblogs.com/onepixel/p/5090799.ht ...
- js的工作原理
JavaScript就是所谓的客户端脚本语言,是一种在互联网浏览器(浏览器也称为Web客户端,因为它连接到Web服务器上,以下载页面)内部运行的计算机编程语言. 也就是说,如果一个网页里有js代码,那 ...
- EJS学习(一)之特性、安装、工作原理
前言 EJS,"E" 代表 "effective",即[高效],EJS 是一套简单的JavaScript模板,EJS 没有如何组织内容的教条:也没有再造一套迭代 ...
- 如何编写高质量的js代码--底层原理
转自: 如何编写高质量的 JS 函数(1) -- 敲山震虎篇 本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm ...
- require.js工作原理(初始)
详情:请见阮一峰老师的日志:http://www.ruanyifeng.com/blog/2012/11/require_js.html: 导入:<script data-main=" ...
- 图解WebGL&Three.js工作原理
“哥,你又来啦?”“是啊,我随便逛逛.”“别介啊……给我20分钟,成不?”“5分钟吧,我很忙的.”“不行,20分钟,不然我真很难跟你讲清楚.”“好吧……”“行,那进来吧,咱好好聊聊” 一.我们讲什么? ...
随机推荐
- 编程之法:面试和算法心得(旋转字符串java实现)
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b ...
- CAS增加免登陆(Remember Me)功能
1. 打开deployerConfigContext.xml 在 authenticationManager 的bean中增加 <property name="authenticati ...
- Js获取或计算时间的相关操作
//获取当前日期(年月日),如:2017-12-18 function getNowDate() { var dd = new Date(); var y = dd.getFullYear(); // ...
- Konig定理及证明
Konig定理 由匈牙利数学家柯尼希(D.Konig)于1913年首先陈述的定理. 定理的内容:在0-1矩阵中,1的最大独立集合最小覆盖包含的元素个数相同,等价地,二分图中的最大匹配数等于这个图中的最 ...
- 基于Skyline与ArcGIS Server的二三维联动功能实现
基于Skyline与ArcGIS Server的二三维联动功能实现主要利用WEB技术.ArcGIS for JavaScript.Skyline 二次开发以及ArcGIS 10.1 桌面工具. 利用A ...
- 关于开启Eureka安全Security认证后,客户端死活注册不上的问题
遇到一个问题"开启Eureka服务端的安全认证后,客户端死活注册不到Eureka上",已经尝试了以下办法,完全搞不定... 客户端出错的版本: spring-boot:2.0.3. ...
- vue elementui点击表格当前行radio单选选中
官方文档:https://element.eleme.cn/#/zh-CN/component/radio 参考:https://www.cnblogs.com/steamed-twisted-rol ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- JEECMS二次开发 -------标签使用说明
转载:https://blog.csdn.net/u012176984/article/details/45501771 一:标签套用结构说明 登录后台管理页面,这些嵌套在html中的标签 以[@标签 ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型
一.概述: 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis ...