function Foo() {
getName = function () { alert(1); }
return this;
}
Foo.getName = function () { alert(2); }
Foo.prototype.getName = function () { alert(3); }
var getName = function () { alert(4); }
function getName () { alert(5); }

这是在网上看到的一道面试题  嗯 考察的知识点挺多  其他的就不多说了

我用我的理解与解题方式来解答这道题

1.首先是变量提升

变量提升包括var 声明的变量和fucntion 声明

举个例子

1.var a=4;

2.function test(){

console.log(456);

};

函数变量声明会先于普通变量之前,并且不会被后面的同名覆盖

但是会被后面的同名赋值覆盖!

就是 function a(){};

var a;

这样不会覆盖函数a

但是如果 var a=4;

函数a就会被覆盖

接下来从第一个开始分析

         Foo.getName();

         首先变量提升之后是这个样子滴

            //变量提升

第一题function Foo(){

getName = function () { alert(1); }//foo函数执行的时候 会覆盖全局中的getName
                 return this;

/*

new 运算符的时候会执行以下

var obj={};//创建一个空对象

将构造函数的作用域赋给新对象

这个新对象的内置原形指向构造函数的原形对象

obj.__proto__=Foo.prototype;

执行构造函数中的代码

返回这个对象(如果显示返回基本数据类型 无效 还是会返回这个对象

如果返回的是引用类型 那么这个对象将没用了)

*/

}

//变量提升

//2.function getName () { alert(5); }

//变量提升

3.var getName;

4.Foo.getName = function () { alert(2); }
           5.Foo.prototype.getName = function () { alert(3); }
           6.getName = function () { alert(4); }

之前的2 会被6覆盖 所以2就可以注释掉了

          第二题 Foo.getName(); //弹出窗口值为2 不用解释了吧
第三题 getName();//弹出窗口值为4
第四题 Foo().getName(); 先执行Foo();
里面的getName=function(){alert(1);} 会覆盖全局作用域中的6
因为是在全局作用域下调用Foo函数 所以this就是window
window.getName(); //弹出窗口值为6 第五题 new Foo.getName(); new (Foo.getName)(); //弹出窗口值为2
笨想:肯定不会是执行Foo.getName 之后才new 会报错
优先级问题 .(成员访问的优先级高于new 并且从左到右
于是就把Foo.getName这个函数当做构造函数执行
                            
       第六题
new Foo().getName();
.运算符从左到右
new Foo(); 返回一个Foo类型的对象 {}
{}.getName();
找不到 然后去构造它的函数Foo的prototype上找
Foo.prototype.getName = function () { alert(3); }
所以结果 3 第七题
也是运算符优先级的问 new new Foo().getName(); 在这里面.的优先级最高
           new ((new Foo()).getName)(); 
先执行.左 然后.右
先执行Foo(); 然后new 返回一个Foo类型的对象
然后得到getName的函数体
然后当做构造函数执行 alert(3) 然后返回一个Foo.getName类型的对象 可能有些地方不是让所有人懂
毕竟我也是一直菜鸟
// Foo.getName(); //2
// getName(); //4
// Foo().getName(); //1
// getName(); //1
// new Foo.getName();//2
// new Foo().getName();//3
// new (new Foo().getName)()//3;

优先级

运算类型

关联性

运算符

20

圆括号

n/a

( … )

19

成员访问

从左到右

… . …

需计算的成员访问

从左到右

… [ … ]

new (带参数列表)

n/a

new … ( … )

函数调用

从左到右

… ( … )

18

new (无参数列表)

从右到左

new …

17

后置递增(运算符在后)

n/a

… ++

后置递减(运算符在后)

n/a

… --

16

逻辑非

从右到左

! …

按位非

从右到左

~ …

一元加法

从右到左

+ …

一元减法

从右到左

- …

前置递增

从右到左

++ …

前置递减

从右到左

-- …

typeof

从右到左

typeof …

void

从右到左

void …

delete

从右到左

delete …

15

从右到左

… ** …

14

乘法

从左到右

… * …

除法

从左到右

… / …

取模

从左到右

… % …

13

加法

从左到右

… + …

减法

从左到右

… - …

12

按位左移

从左到右

… << …

按位右移

从左到右

… >> …

无符号右移

从左到右

… >>> …

11

小于

从左到右

… < …

小于等于

从左到右

… <= …

大于

从左到右

… > …

大于等于

从左到右

… >= …

in

从左到右

… in …

instanceof

从左到右

… instanceof …

10

等号

从左到右

… == …

非等号

从左到右

… != …

全等号

从左到右

… === …

非全等号

从左到右

… !== …

9

按位与

从左到右

… & …

8

按位异或

从左到右

… ^ …

7

按位或

从左到右

… | …

6

逻辑与

从左到右

… && …

5

逻辑或

从左到右

… || …

4

条件运算符

从右到左

… ? … : …

3

赋值

从右到左

… = …

… += …

… -= …

… *= …

… /= …

… %= …

… <<= …

… >>= …

… >>>= …

… &= …

… ^= …

… |= …

2

yield

从右到左

yield …

yield*

从右到左

yield* …

1

展开运算符

n/a

... …

0

逗号

从左到右

… , …

一道面试题 包含了new的细节 和运算符的优先级 还有属性访问机制的更多相关文章

  1. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  2. PHP递归创建多级目录(一道面试题的解题过程)

    今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...

  3. 关于Java类加载双亲委派机制的思考(附一道面试题)

    预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...

  4. 一道面试题比较synchronized和读写锁

    一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...

  5. <转>一道面试题比较synchronized和读写锁

    一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...

  6. 一道面试题与Java位操作 和 BitSet 库的使用

    前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...

  7. 【C#基础知识】静态构造函数,来源于一道面试题的理解

    看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ...

  8. 关于一道面试题,使用C#实现字符串反转算法

    关于一道面试题,使用C#实现字符串反转算法. 题目见http://student.csdn.net/space.php?do=question&ac=detail&qid=490 详细 ...

  9. 一道笔试题和UML思想 ~

    一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...

随机推荐

  1. saltStack运维工具的部署及master迁移实现的过程详解

    服务器端:192.168.3.87 客户端:192.168.3.86.192.168.3.108 1.salt服务器端安装 192.168.3.87 rpm -Uvh http://mirrors.y ...

  2. Weex学习资料整合

    1.weex weex文档:http://weex.apache.org/cn/guide/index.html Weex Ui awesome-weex WEEX免费视频教程-从入门到放肆 (共17 ...

  3. Python-GIL 进程池 线程池

    5.GIL vs 互斥锁(*****) 1.什么是GIL(Global Interpreter Lock) GIL是全局解释器锁,是加到解释器身上的,保护的就是解释器级别的数据 (比如垃圾回收的数据) ...

  4. 转:vue+canvas如何实现b站萌系登录界面

    https://juejin.im/post/5ae802a46fb9a07ac55fec04

  5. Codeforces 448C Painting Fence(分治法)

    题目链接:http://codeforces.com/contest/448/problem/C 题目大意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅 ...

  6. 步步为营-68-asp.net简单练习(get set)

    1 加法计算器 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  7. MVC开发中的常见错误-06-"无法在发送 HTTP 标头之后进行重定向。"

    通过监视可以看到: 原来是跳转到登录页面后,登录页面中又发送了一个GeMneuItems的请求,用于加载页面图片

  8. C# 串口导致电脑蓝屏一个可能的原因

    在某些win7电脑上, 如果使用SerialPort对象的Read(byte[] buffer, int offset, int count)方法读取端口数据时, 若端口接受缓存区的数据少于count ...

  9. POJ 3616 Milking Time 【DP】

    题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量.思路:一定是 ...

  10. POJ 3040 Allowance【贪心】

    POJ 3040 题意: 给奶牛发工资,每周至少 C 元.约翰手头上有面值V_i的硬币B_i个,这些硬币的最小公约数为硬币的最小面值.求最多能发几周? 分析: 贪心策略是使多发的面额最小(最优解).分 ...