运行程序,解读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.在可执行程序或快捷方式上右键->属性-> ...
随机推荐
- vue-router 编程式导航
借助vue-router的实例方法,通过编写代码来实现导航的切换: back:回退一步 forward:前进一步 go:指定前进回退步数 push:导航到不同url,向history栈添加一个新的记录 ...
- 何凯文每日一句打卡||DAY5
- Linux之svn数据备份、还原及迁移
前言 因管理需求现要将svn数据进行备份,作为运维小哥的我在收到指令后进行了相关操作.当然,领导告知的是要备份,但作为一个有思想的运维,我考虑到的是自己要干的不仅仅是备份操作,还要确保在备份后数据还原 ...
- html5 canvas 奇怪的形状水平渐变(因为大多数的之前的文章把基础都打过了,所以开始写的快了,如果有不明白的,可以回顾下之前的)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 如何使用ASP.NET开发基于推技术的聊天室?
public class Content : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){ ...
- vue双向绑定原理分析
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/jiangzhenf ...
- C++产生固定范围内的固定数量的随机数
#include<iostream> #include<ctime> #include<random> using namespace std; void knut ...
- Oracle错误及解决方案
1.ORA-00257:归档程序错误.在释放之前仅限于内部链接 问题原因:归档日志占满了空间 解决方法: .增加归档日志空间 alter system set db_recovery_file_des ...
- 利用shell找出15分钟内修改的文件
如果你的文件只是生成不会修改的话,可以这样: find * -mmin -15 2>/dev/null 如果可能修改,则需要这样(先创建一个 15 分之前的时间戳的文件,然后找比这个文件新的文件 ...
- Linux 黑白界面显示
2014年1月14日 15:47:47 不知道别人怎么看,反正我觉得黑白配显示很方便阅读 命令: ls 脚本: ~/.bashrc 指令: alias ls='ls --color=never' 命令 ...