运行程序,解读this指向---case5
function OuterFn() {
innerFn = function() { console.log(1); };
return this;
}
OuterFn.innerFn = function () { console.log(2);}
OuterFn.prototype.innerFn = function () { console.log(3);}
var innerFn = function() { console.log(4);}
function innerFn() { console.log(5);}
//请写出以下输出结果 OuterFn.innerFn(); innerFn(); OuterFn().innerFn(); innerFn(); new new OuterFn().innerFn(); //3
第1问
这里省略分析,一眼就可以看出来答案。
第2问
function OuterFn() {
innerFn = function () { console.log(1); }
return this;
}
var innerFn; //变量声明提升
function innerFn() { console.log(5);} //函数声明提升,覆盖了变量声明
OuterFn.innerFn = function () { console.log(2);};
OuterFn.prototype.innerFn = function () { console.log(3);};
innerFn = function () { console.log(4);}; //最终赋值覆盖上面的函数声明
innerFn();// 4
第3问
先执行了OuterFn函数,然后调用OuterFn函数的返回值对象的innerFn属性函数。
因为没有var声明,所以向上层作用域寻找,找到了innerFn,也就是第2问的console.log(4),于是console.log(1)覆盖console.log(4),修改了外层作用域变量。
此处若依然没有找到会一直向上查找到window对象,若window对象中也没有innerFn属性,就在window对象中创建一个innerFn变量。这里的this指向window,相当于执行了window.innerFn();
第4问
直接调用innerFn(),相当于window.innerFn(),因为第3问的OuterFn()执行时修改了innerFn,因此结果与第3问相同。
在分析下面问题前,先回顾一下运算符优先级。
():圆括号 .:成员访问符 new Fn():有参构造 Fn():函数调用 new Fn:无参调用
参考MDN运算符优先级表格,排名结果为:圆括号 > 成员访问符 == 有参构造 == 函数调用 > 无参构造
第5问
因为成员访问符优先级高于无参构造优先级,所以先计算OuterFn.innerFn,而不是new OuterFn;接着,由于有参构造和函数调用优先级相等,那么顺序从左到右执行,相当于new (OuterFn.innerFn)()。
第6问
因为有参构造,成员访问符,函数调用优先级相等,那么顺序从左到右执行即可,相当于(new OuterFn()).innerFn()。
第7问
因为有参构造和成员访问符优先级相等,所以先计算new OuterFn();接着,由于无参构造优先级低于成员访问符,所以先计算后面,(new OuterFn()).innerFn;由于有参构造和函数调用优先级相等,那么顺序从左到右执行即可,相当于执行new ((new OuterFn()).innerFn)()。
运行程序,解读this指向---case5的更多相关文章
- 操作系统篇-hello world(免系统运行程序)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...
- windows服务编写和“以管理员运行”程序的方法
本文将首先解释如何 创建 一个定期查询可用物理内存并将结果写入某个文本文件的服务.然后指导你完成生成,安装和实现服务的整个过程. 第一步:主函数和全局定义 首先,包含所需的头文件.例子要调用 Win3 ...
- python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统
python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统 引子 python是什么? 什么是编程语言?为何要有编程语言? 什么是编程?什么是程序?什么是进程?为何要编程? 计算机基础 ...
- CYPEESS USB3.0程序解读之---GPIO
CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...
- Xcode 运行程序,左侧memory 不显示内存
运行程序后,xcode 不显示当前使用的内存情况,问题是打开了僵尸--enable zoombie Objects,关闭即可 打开 product--->SCheme-->EditSChe ...
- C# 管理员身份运行程序
在使用winform程序获取调用cmd命令提示符时,如果是win7以上的操作系统,会需要必须以管理员身份运行才会执行成功,否则无效果或提示错误. 比如在通过winform程序执行cmd命令时,某些情况 ...
- IntelliJ IDEA 配置运行程序
IntelliJ IDEA 对于Javaer开发来说还是很nice的,就是第一次用可能配置项有点生疏,这里就记录一下IntelliJ IDEA 配置运行程序. 1. 点击Edit Config... ...
- Usage: AddDimensionedImage imageFile outputFile eclipse 运行程序出错
关于这个在eclipse中运行java程序的错,首先确认你的jdk,jre是否完整,并且与你的eclipse的位数相同,当然我相信这个错误大家应该都会去检查到. 第二个关于addDimensioned ...
- [原创]Win7、Win8、Win10始终以管理员身份运行程序。
在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...
随机推荐
- linux man命令
http://note.youdao.com/noteshare?id=98878258c6453f92117355deba8b8439
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Sql Server数据库小知识点总结
把我在开发时候遇到的一点小知识持续更新在这里~ 1.where条件时常变 where UserID='1' 这里的UserID呢,它的值是经常在变化的,有时候要查2,有时候要查3的,有时候要查全部人! ...
- git 学习小记
话说 git 出了已经很久了,可是我一直没用过.其实也不是没用过,只不过在 github 上下载东西那根本就不是在用 git,只是单纯的HTTP下载而已.我们公司用的是 svn,所以我只会一点点svn ...
- size属性
size 属性 size 属性规定输入字段的尺寸(以字符计): <form action=""> First name:<br> <input typ ...
- 编写安全的API接口
HTTPS接口参数加密签名设计思路 数名 类型 必选 描述 _appid string 是 调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范. ...
- Django中合并同一个model的多个QuerySet
[1]相同modelarticles1 = Article.objects.order_by("autoid").filter(autoid__lt = 16).values('a ...
- HDU 2049 不容易系列之(4)——考新郎 (错排+组合)
题目链接. Problem Description 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体 ...
- 月薪20K软件测试自动化岗必问面试题:验证码识别与处理
本文乃Happy老师的得意门生来自java全栈自动化测试4期的小核桃所作.正所谓严师出高徒,笔下有黄金~~让我们一起来征服面试官吧~~ 在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让 ...
- plsql 查询 卡死问题解决
plsql可以连接数据库,一点查询就卡死.sqlplus可以连接数据库,也可以查询.后经过测试,原来plsql所引用的路由器ip和服务器ip有限制,修改同一网段ip问题解决.但是不知为何不同网段ip可 ...