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平常会跳的坑系列(一)的更多相关文章

  1. JavaScript日常会跳的坑系列(二)

    1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ...

  2. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  3. 《神秘的程序员们》漫画26~28:《万年坑系列》 I、II、III(转)

    26 <万年坑系列> I:那些令你憎恶的系统从何而来? 世界上总有一些令人憎恶的系统,而你却天天非用不可.这些系统的提供方们既不缺钱也不缺人,有的还很热衷于改版升级. 但为何升级完后,它们 ...

  4. 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)

    2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...

  5. 2-STM32带你入坑系列(点亮一个灯--Keil)

    1-STM32带你入坑系列(STM32介绍) 首先是安装软件 这一节用Kei来实现,需要安装MDK4.7这个软件,怎么安装,自己百度哈.都学习32的人了,不会连个软件都不会安装吧....还是那句话 没 ...

  6. 1-STM32带你入坑系列(STM32介绍)

    由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...

  7. MySQL填坑系列--Linux平台下MySQL区分大小写问题

    大家好,我是软件大盗(道),下面开始我们的<MySQL填坑系列>. 笔者最近又在MySQL的边缘试探,然后,试探着,试探着就报错了. 书接上文,系统连接数据库时报错:找不到DB_TIMIN ...

  8. JavaScript中的数据结构及实战系列

    本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈

  9. jmeter踩坑系列

    1.踩坑系列一: 抓包出来有host的字段,放到jmeter里面一起请求就报错了,去掉就请求正常了 1.踩坑系列二: 从花瓶复制过去 的values 前面有空格,肉眼看起来没有

随机推荐

  1. [转] Manacher算法详解

    转载自: http://blog.csdn.net/dyx404514/article/details/42061017 Manacher算法 算法总结第三弹 manacher算法,前面讲了两个字符串 ...

  2. 封装一个MongoDB的 asp.net 链接类

    using System; using System.Collections.Generic; using System.Linq; using MongoDB; /// <summary> ...

  3. JD-GUI反编译后代码逻辑分析

    一,用jd-gui.exe等工具查看源代码.如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879 可以到以下连接下载可 ...

  4. Dispatcher及线程操作

    WPF 应用程序启动后,会有两个线程: 1. 一个是用来处理UI呈现(处理UI的请求,比如输入和展现等操作). 2. 一个用来管理 UI的 (对UI元素及整个UI进行管理). WPF在线程里面是不可以 ...

  5. POJ 1200 Crazy Search

    思路:利用Karp-Rabin算法的思想,对每个子串进行Hash,如果Hash值相等则认为这两个子串是相同的(事实上还需要做进一步检查),Karp-Rabin算法的Hash函数有多种形式,但思想都是把 ...

  6. SAE网站搭建(1)

    用了半天时间,把Django的基本结构同步到SAE上了,里边比较麻烦的地方如下: 1. 数据库的同步; SAE用的是SQL数据库,默认使用下面的用户名.密码等变量(SAE为我们做了很多工作) 首先需要 ...

  7. Ubuntu 14.04 SSH + 远程登录xrdp

    1. 安装ssh 打开"终端窗口",输入"sudo apt-get install openssh-server"-->回车-->输入"y ...

  8. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  9. ubuntu下git安装及连接github

    1.安装 sudo apt-get install git git-core git-gui git-doc git-svn git-cvs gitweb gitk git-email git-dae ...

  10. Call Hierarchy(方法调用层次)

    在VS2010中的一项新功能:Call Hierarchy窗口,它可以审查代码,确定方法在哪里调用,以及它们与其他方法的关系. 打开一个类文件,找有方法体实现代码的方法,右键选择View Call H ...