JavaScript平常会跳的坑系列(一)
function Foo() {          //定义foo函数
    getName = function () { console.log('1');};
    console.log(this);
    return this;
}
Foo.getName = function () { console.log('2');};   //Foo创建了一个叫getName的静态属性存储了一个匿名函数
Foo.prototype.getName = function () { console.log('3');};  //Foo的原型对象新创建了一个叫getName的匿名函数
var getName = function () { console.log('4');};       //函数变量表达式创建了一个getName的函数
function getName() { console.log('5');}      //声明一个叫getName函数
//由于变量定义提升,该段JavaScript实际上的解析顺序如下
/*
function Foo() {          //定义foo函数
    getName = function () { console.log('1');};
    console.log(this);
    return this;
}
var getName;
function getName() { console.log('5');}
Foo.getName = function () { console.log('2');};   //声明foo的getName静态属性
Foo.prototype.getName = function () { console.log('3');};  //以foo为原型再声明一个getName静态属性
getName = function () { console.log('4');};
 */
Foo.getName(); //2
//析:访问Foo函数上存储的静态属性
getName(); //4
//由于变量定义提升,所有声明变量或声明函数都会被提升到当前函数的顶部,真正的执行顺序如下
/*var getName;
function getName() { console.log('5');}
getName = function () { console.log('4');}; */
Foo().getName(); //1
//析:考察变量作用域问题,this指向问题;
//先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数
//此时foo的返回值为Window对象
//Foo函数的第一句  getName = function () { alert (1); };  是一句函数赋值语句,注意它没有var声明,所以先向当前Foo函数作用域内寻找getName变量,没有。再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量,找到了,也就是第二问中的alert(4)函数,将此变量的值赋值为 function(){alert(1)}。
//此处实际上是将外层作用域内的getName函数修改了。
//注意:此处若依然没有找到会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中创建一个getName变量。
getName(); //1
//getName函数,相当于 window.getName() ,因为这个变量已经被Foo函数执行时修改了,遂结果与第三问相同,为1
new Foo.getName(); //2
//点(.)的优先级高于new操作,遂相当于是:new (Foo.getName)();
//所以实际上将getName函数作为了构造函数来执行,遂弹出2。
new Foo().getName(); //3
//析:Foo()返回的this是foo()对象,调用getName()匿名函数打印3
new new Foo().getName(); //3
//析:
/*第七问, new new Foo().getName(); 同样是运算符优先级问题。
最终实际执行为:
new ((new Foo()).getName)();
先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。
遂最终结果为3*/
JavaScript平常会跳的坑系列(一)的更多相关文章
- JavaScript日常会跳的坑系列(二)
		1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ... 
- gulp入坑系列(2)——初试JS代码合并与压缩
		在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ... 
- 《神秘的程序员们》漫画26~28:《万年坑系列》 I、II、III(转)
		26 <万年坑系列> I:那些令你憎恶的系统从何而来? 世界上总有一些令人憎恶的系统,而你却天天非用不可.这些系统的提供方们既不缺钱也不缺人,有的还很热衷于改版升级. 但为何升级完后,它们 ... 
- 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
		2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ... 
- 2-STM32带你入坑系列(点亮一个灯--Keil)
		1-STM32带你入坑系列(STM32介绍) 首先是安装软件 这一节用Kei来实现,需要安装MDK4.7这个软件,怎么安装,自己百度哈.都学习32的人了,不会连个软件都不会安装吧....还是那句话 没 ... 
- 1-STM32带你入坑系列(STM32介绍)
		由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ... 
- MySQL填坑系列--Linux平台下MySQL区分大小写问题
		大家好,我是软件大盗(道),下面开始我们的<MySQL填坑系列>. 笔者最近又在MySQL的边缘试探,然后,试探着,试探着就报错了. 书接上文,系统连接数据库时报错:找不到DB_TIMIN ... 
- JavaScript中的数据结构及实战系列
		本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈 
- jmeter踩坑系列
		1.踩坑系列一: 抓包出来有host的字段,放到jmeter里面一起请求就报错了,去掉就请求正常了 1.踩坑系列二: 从花瓶复制过去 的values 前面有空格,肉眼看起来没有 
随机推荐
- Bat 中特殊符号
			批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ... 
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页快捷方式(Ⅲ)
			上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 登录窗口>,主要是介绍系统登录界面页面设计与代码. 最近刚做完施工计划安排设计,之后将分享出来,这个系列更新不是很快,望 ... 
- NESPER的大体结构 z
			NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll. (1)NEsper的核心包包含了EPL语法解析引擎,事件监听机制,事件处理等核心模块. (2)NEs ... 
- 如何使一个网络下的2台路由器都可以dhcp上网
			设备:2台路由器,网线若干 首先,设置好一个路由器,让它可以拨号上网.网关设置为192.168.1.1,子网掩码为255.255.255.0,dns为61.177.7.1 然后,设置第二台路由器.设置 ... 
- HTTP分段下载
			现代WEB服务器都支持大文件分段下载,加快下载速度,判断WEB服务器是否支持分段下载通过返回头是否有 Accept-Ranges: bytes 字段.分段下载分为两种,一种就是一次请求一个分段,一种就 ... 
- BZOJ2818: Gcd 欧拉函数求前缀和
			给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ... 
- [Tommas] UNION 和 UNION ALL 的区别
			UNION指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看,UNION跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料.UNION的一个限制是两个 SQL 语句所产生的 ... 
- Got error creating database manager: java.io.IOException解决方法
			14/03/26 23:03:55 ERROR tool.BaseSqoopTool: Got error creating database manager: java.io.IOException ... 
- HW4.3
			public class Solution { public static void main(String[] args) { final double POUND_PER_KILOGRAM = 2 ... 
- hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful【双连通分量求桥&&输出桥&&字符串处理】
			By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others) ... 
