# 声明:学习编程语言最好的方式就是通过实例学习
       
## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解
题目:
```bash
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);}

//请写出以下输出结果:
Foo.getName(); //第一题  答案:2
getName(); //第二题  答案:4
Foo().getName();         //第三题  答案:1
getName(); //第四题  答案:1
new Foo.getName(); //第五题  答案:2
new Foo().getName(); //第六题  答案:3
new new Foo().getName(); //第七题  答案:3

```
## 解释
### 第一题 Foo.getName();
(1).这一题涉及静态属性
```bash
例如:
        function A(){}
A.name = "我是A的静态属性name";
console.log((A.name);
```
事实上执行的是:
```bash
Foo.getName = function () { alert (2);};
```
### 第二题 getName();
(1).这一题涉及函数声明和函数表达式(
共同点:1.两者都会提升到作用域开始部分
  不同点:1.函数声明提升的是整个函数对象,也就是说你即使在函数定义之前调用这个函数,这个函数也会被执行
```bash
       函数声明:function A(){}
```
      2.函数表达式提升之后,表达式值为undefined,也就是说你需要在函数定义之后调用这个函数表达式
```bash
       函数表达式:var A=function(){}
```
      3.如果都存在,函数名字也相同,那么函数表达式就会覆盖函数生命的部分
)
事实上执行的是:
```bash
              var getName = function () { alert (4);};
```
### 第三题 Foo().getName(); //(声明:这题答案应该是4,为了混乱你的思维,就先暂时理解为1吧)
(1).这一题涉及全局变量
1.首先认清楚什么是全局变量和局部变量的区别
      区别:
         1.全局变量是在函数范围外声明或在function范围内不加var声明
         而局部变量是在函数内使用var声明的变量
         例如:
                 

```bash
var name = "我的名字";
          function A(){
myname="你的名字";
            var hername="她的名字";
}
```
    2.上面name,myname是全局变量,hername是局部变量
  2.全局变量可以使用window对象直接访问到
事实上执行的是:
```bash
              function Foo() {
              getName = function () { alert (1); };
              return this;
              }
```
解释:getName声明为全局是全局函数表达式,可以通过window对象直接调用,执行玩FOO函数返回this指针(即windos对象),然后根据windos对象调用getName全局函数

### 第四题 getName();
(1).这题其实是调用
```bash
     this.getName();
```
(2).答案给的是一,其实基本功扎实的应该会知道答案是4,(尼玛,第三题说成是1我就忍了,不过也许是作者只是想传达函数调用的思想)

### 第五题 new Foo.getName();
(1).这题答案没有争议
  实际上与以下类似
```bash
      function A(){}
new A();
```
(2).这里只是多了个FOO,我说了,FOO是对象,这里的getName是FOO的静态属性

### 第六题
(1).这题答案也是对的,涉及函数原型的知识点
事实上执行的是:
```bash
     (new FOO()).getName();
```
(2).可能有宝宝会疑问,为什么不是1呢问的好
```bash
      如果写成  var $this = FOO();
$this.getName(); //这个时候答案是1(如果下面没有其他的getName定义,否则答案还是4)
```

其实这题调用的是FOO()原型的getName()方法
//本来想多写点,但涉及到prototype原型的方法,喜欢的话以后继续更新

### 第七题
(1).实际上执行
```bash
    (new (new FOO()).getName())
```
(2).这一题实际上调用了两次构造函数,与上一题类似,但本体会生成一个新的对象

//不多说,项目中也用不到

## 最后留一道题
```bash
function C(){};
C.prototype.test=function(){console.log("mytest");};
C.prototype.test.prototype.testName=function(){console.log("mygod");};
(new (new C()).test()).testName();
```
###想知道答案的宝宝记得在github上call我

一道经典的js面试题的更多相关文章

  1. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  2. 遇到一道经典的java面试题

    在文件 nameList.txt 中按下图格式存放着超过50万人的姓名与身份证信息.请使用您熟悉的编程语言(Java或C/C++)编写一段程序, 将出生日期落在1995年1月1日与1999年12月31 ...

  3. [置顶] 一道经典的sql面试题不同的写法

    用一条SQL语句   查询出每门课都大于80分的学生姓名,表( #test)如下:    Name Course Mark 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...

  4. 一道经典的Java面试题:equals ,== 和hashcode()的区别

    一句话区别:==比较的是内存地址,equals比较的是值内容 结论: 从以下三点展开: 基本数据类型.字符串.对象 对于基本数据类型:只有==,没有equals. 对于字符串:==比较的是内存地址,e ...

  5. 一道变态的js题

    一道腾讯js面试题 题目如下: f = function() {return true;}; g = function() {return false;}; (function() { if (g() ...

  6. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  7. 一道经典JS面试题

    超过80%的候选人对下面这道JS面试题的回答情况连及格都达不到.这究竟是怎样神奇的一道JS面试题?他考察了候选人的哪些能力?对正在读本文的你有什么启示? 不起眼的开始 招聘前端工程师,尤其是中高级前端 ...

  8. 一道JS面试题引发的血案

    刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...

  9. 一道经典面试题-----setTimeout(function(){},0)

    一道经典面试题-----setTimeout(function(){},0) 转载: http://www.w3cfuns.com/notes/17398/e8a1ce8f863e8b5abb5300 ...

随机推荐

  1. 数据结构:点之间的最短距离--Floyd算法

    Floyd算法 Floyd算法 Dijkstra算法是用于解决单源最短路径问题的,Floyd算法则是解决点对之间最短路径问题的.Floyd算法的设计策略是动态规划,而Dijkstra採取的是贪心策略. ...

  2. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  3. win10家庭版连接不上远程桌面

    解决方案来自于:https://blog.csdn.net/weixin_39129504/article/details/80303615 这个解决方案的关键: done!不知是否侵权  如有侵权 ...

  4. 第1讲:The nature of Testing--測试的本质

    *********声明:本系列课程为Cem Kanner的软件黑盒測试基础的笔记版************** What's A COMPUTER PROGRAM? Textbooks often d ...

  5. 零元学Expression Design 4 - Chapter 6 教你如何在5分钟内做出文字立体感效果

    原文:零元学Expression Design 4 - Chapter 6 教你如何在5分钟内做出文字立体感效果 又来一篇五分钟做设计啦~ 本篇将教大家如何运用Design内建工具Blend Path ...

  6. 知乎C++问题整理

    如何平衡性能,合理选择C++STL集装箱? ANSER: 首先要搞清楚,假设STL问题,那么问题出在哪里? STL能够简单地觉得就是算法+数据结构,全部容器的算法选择和实现都是经过精心设计和严格測试的 ...

  7. sql 多列求和

    列相加即可注意Null不可加,先用ISNULL方法验证,设置默认值 SELECT ID, Name, Province, City, District, ISNULL(row1, 0), ISNULL ...

  8. 【C++】【TinyXml】xml文件的读写功能使用——写xml文件

    TinyXml工具是常用比较简单的C++中xml读写的工具 需要加载 #include "TinyXml\tinyxml.h" 在TinyXML中,根据XML的各种元素来定义了一些 ...

  9. Java FTP 基本操作

    最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容. FTP基础 关于 FTP 基础推荐阅读<使用 Socket 通信实现 FTP 客户端程序>,其中需要特别注意的是主动模 ...

  10. Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)

    在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFY ...