# 声明:学习编程语言最好的方式就是通过实例学习
       
## 下面是我在博客上看到的一道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. Js跨域小总结

    教程 以下的例子包含的文件均为为http://www.a.com/a.html.http://www.a.com/c.html 与http://www.b.com/b.html ,要做的都是从a.ht ...

  2. hudson搭建经验总结(三)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在创建hudson账户和分配权限时出错,当单击save按钮时出现 HTTP Status 500 - type Exc ...

  3. wpf控件设计时支持(1)

    原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开发环境下,右侧的Proper ...

  4. OpenGL+VS2012编译环境配置

    OpenGL库主体分为三部分,分别是 gl(OpenGL核心库) glu(Utility Library,OpenGL实用库) glut(Utility Toolkit,OpenGL实用工具库) gl ...

  5. 思想者:漫谈大学生的四个LEARN

     核心提示:哪四个Learn呢?Learn to learn(学习怎样学习),Learn to be(学习怎样做人),Learn to do(学习怎样做事),Learn totogether(学习 ...

  6. matlab 求解 Ax=B 时所用算法

    x = A\B; x = mldivide(A, B); matlab 在这里的求解与严格的数学意义是不同的, 如果 A 接近奇异,matlab 仍会给出合理的结果,但也会提示警告信息: 如果 A 为 ...

  7. Matlab随笔之求解线性方程

    原文:Matlab随笔之求解线性方程 理论知识补充: %矩阵除分为矩阵右除和矩阵左除. %矩阵右除的运算符号为“/”,设A,B为两个矩阵,则“A/B”是指方程X*B=A的解矩阵X. %矩阵A和B的列数 ...

  8. cocos2d-x 源代码分析 : Ref (CCObject) 源代码分析 cocos2d-x内存管理策略

    从源代码版本号3.x.转载请注明 cocos2d-x 总的文件夹的源代码分析: http://blog.csdn.net/u011225840/article/details/31743129 1.R ...

  9. gtest写了第一个测试用例错误和结算过程

    安装好gtest后,编写第一个測试案例test_main.cpp #include <iostream> #include <gtest/gtest.h> using name ...

  10. MySql 5.7 重置root密码

    一.以安全模式登录 # Stop MySQL sudo service mysql stop # Make MySQL service directory. sudo mkdir -p /var/ru ...