一道JS面试题
来源:互联网 发布:微信站街软件免费下载 编辑:程序博客网 时间:2024/04/29 20:55
摘自微信公众号
function Foo() { getName = function() { //这里没var,因此改变的全局变量上的属性!!! alert(1); }; return this; } Foo.getName = function() { alert(2); }; Foo.prototype.getName = function() { console.log(this); this.aa = '123'; alert(3); }; var getName = function() { alert(4); }; function getName() { //函数声明会被提前,会被var操作覆盖掉 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
下面一一解释下(个人浅显的理解…)
1. 调用的是Foo函数对象上的getName函数。输出2
2. 全局作用域下的getName,相当于window.getName()。如何判断时输出4而不是5呢?两个都是定义了相同名称的getName,而且function关键字定义的函数还是后面才定义的,应该是覆盖了var定义的函数才对啊?,在JS中,函数的声明和定义将会被提前,也就是说,我可以先使用这个函数,后面才去定义,JS在执行时,将会把doSth()
的定义提前,我们才得以引用函数。变量就不会。因此后面的var关键字定义将提前的function
定义给重置了。
3. 这里粗心的话,很容易得出alert(4)
的结论,仔细一看,Foo函数中定义的getName没有var,因此时一个全局变量,改变了全局的getName,因此输出1
4. 同上,被修改了全局的getName
。
5. 和第一个一样,new的是Foo函数对象上的getName函数
6. 先new Foo()
,然后getName()
,因此调用的时原型链上的getName
7. 先new Foo()
,然后new Foo对象
上的getName
,就是new Foo.prototype.getName()
0 0
- 一道JS面试题
- 一道JS 面试题
- 一道JS面试题
- 一道js面试题
- 一道JS面试题
- 一道有趣的JS面试题
- 一道js面试题引发的思考
- 一道很不错的js面试题
- 一道 JS 面试题引发的思考
- 一道有意思的JS面试题
- 一道JS面试题及分析
- 一道js面试题的深入~
- 一道微软面试题
- 一道面试题
- 华为一道面试题
- 一道面试题
- 一道面试题
- 一道sql面试题
- 保存到数据库
- android adb 常用命令
- 固定本机宽带IP对外开放个人网站
- OC中NSLog函数输出格式详解
- JAVA类的生命周期
- 一道JS面试题
- 面试题目:有序数组建立二叉排序树
- 关于Activity被染色的原因以及解决方案
- Swift实现自定义的UITabBarController
- Grub2修复步骤
- 中星微USB摄像头驱动分析及视频捕获
- linux防火墙开对指定ip段开放端口
- android时差8小时
- animationWithKeyPath