一道经典的js面试题
# 声明:学习编程语言最好的方式就是通过实例学习
## 下面是我在博客上看到的一道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面试题的更多相关文章
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- 遇到一道经典的java面试题
在文件 nameList.txt 中按下图格式存放着超过50万人的姓名与身份证信息.请使用您熟悉的编程语言(Java或C/C++)编写一段程序, 将出生日期落在1995年1月1日与1999年12月31 ...
- [置顶] 一道经典的sql面试题不同的写法
用一条SQL语句 查询出每门课都大于80分的学生姓名,表( #test)如下: Name Course Mark 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...
- 一道经典的Java面试题:equals ,== 和hashcode()的区别
一句话区别:==比较的是内存地址,equals比较的是值内容 结论: 从以下三点展开: 基本数据类型.字符串.对象 对于基本数据类型:只有==,没有equals. 对于字符串:==比较的是内存地址,e ...
- 一道变态的js题
一道腾讯js面试题 题目如下: f = function() {return true;}; g = function() {return false;}; (function() { if (g() ...
- 解析js中作用域、闭包——从一道经典的面试题开始
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...
- 一道经典JS面试题
超过80%的候选人对下面这道JS面试题的回答情况连及格都达不到.这究竟是怎样神奇的一道JS面试题?他考察了候选人的哪些能力?对正在读本文的你有什么启示? 不起眼的开始 招聘前端工程师,尤其是中高级前端 ...
- 一道JS面试题引发的血案
刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...
- 一道经典面试题-----setTimeout(function(){},0)
一道经典面试题-----setTimeout(function(){},0) 转载: http://www.w3cfuns.com/notes/17398/e8a1ce8f863e8b5abb5300 ...
随机推荐
- imageNamed 与 imageWithContentsOfFile差额
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 普通情况下 ...
- 常见Python 中pip用法(待继续添加)
常见pip用法 * pip install numpy --安装包numpy * pip uninstall numpy --卸载包numpy * pip ...
- Python 动图、动画制作 —— moviepy、matplotlib.animation
进入命令行界面(windows ⇒ cmd),下载安装,pip install moviepy 0. figure 的成员函数 # 创建 figure fig, ax = plt.subplots() ...
- Spring RestTemplate 专题
相同的参数(接口的入参json打印在日志了)在PostMan中返回预期的数据,但使用RestTemplate时去提示信息错误(参数中汉字).这种情况,搞得怀疑对RestTemplate的理解了使用Re ...
- Java内部类——学习笔记
参考:http://blog.csdn.net/aaronsi/article/details/187322 和 http://openhome.cc/Gossip/JavaGossip-V1/Inn ...
- WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...
- 构建自己的PHP框架(邮件发送)
完整项目地址:https://github.com/Evai/Aier 我们采用 'nette/mail' 包作为我们的邮件发送基础模块,在它的基础上封装一个 'Mail' 类,暴露出简洁的 API ...
- Coder-Strike 2014 - Finals (online edition, Div. 1)
CF 420A A. Start Up 题目链接: http://codeforces.com/problemset/problem/420/A 题目意思: 给一个字符串A,通过镜面反射后得到A', ...
- WPF中Binding使用StringFormat格式化字符串方法
原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...
- WPF 遍历DataTemplate(获取所有控件)
原文:WPF 遍历DataTemplate(获取所有控件) 情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件. 方法: http://b ...