new Foo().getName()经典面试题
一道经典的面试题,下面用a b c d 标注方便讲解
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>//a function Foo() {getName = function() {console.log(1);};return this;}//bFoo.getName = function() {console.log(2);};//cFoo.prototype.getName = function() {console.log(3);};//d var getName = function() {console.log(4);};//e function getName() {console.log(5);}Foo.getName(); // 2getName(); // 4Foo().getName(); // 1getName(); // 1new Foo.getName(); // 2new Foo().getName(); // 3new new Foo().getName(); // 3</script>
</body></html>
解析:
1. Foo.getName(); // 2
对象.属性 这里Foo作为函数对象,getName()作为Foo的函数属性,所以看题目b处
2.getName(); // 4
这里主要看题目d e 处,d处为一个函数表达式,e声明了一个函数
两者内容相同,我们可以根据函数优先规则 函数声明>变量
那e处提到题目前面
根据js自上而下运行,先运行题目e处,再把d处赋值给getName,所以覆盖了e处
如下
//e 声明了一个getName函数let getNamegetName = function() {console.log(5);}//d 函数表达式getName = function() {console.log(4);};
3.Foo().getName(); // 1**
这里看题目a处
因为Foo打了小括号,所以就是调用Foo函数
并且给全局变量getName重新赋值
4.getName(); // 1
因为前面3运行题目a处,给getName赋值了
5. new Foo.getName(); // 2
对象.属性,这里看b处
new Foo.getName==new(Foo.getName())
所以这里先调用了Foo.getName,运行结果为2
然后再实例化返回值2
6.new Foo().getName(); // 3
因为Foo打了小括号,所以就是调用Foo函数
并且前面有new,就意味着是用new调用的Foo函数
那么此时相当于是把Foo当做了构造函数
相当于(new Foo()).getName()
所以返回了Foo实例化出来的对象,这个对象自己没有
getName方法,所以就访问原型里的getName,既题目c处
7.new new Foo().getName(); // 3
这里可以看做new((new Foo()).getName())
右上可得 new(3)
所有实例化返回值为3
写在最后,都是个人理解,题目讲解方式参照博客大佬排版
https://blog.csdn.net/redatao/article/details/107955687
new Foo().getName()经典面试题相关推荐
- JS经典面试题04-原型链Foo.getName
1.1-答案揭晓 1.2-原理解析 <!DOCTYPE html> <html lang="en"><head><meta charset ...
- new new Foo().getName()面试题解析
经典面试题 Foo().getName() 解析 题目如下,写出输出内容(注释:abcde为步骤标号,便于下边分析定位) // a. function Foo () {getName = functi ...
- js中的经典题Foo.getName
js中的经典题Foo.getName Foo.getName所涉及到的知识点 先看看题目代码: Foo.getName所涉及到的知识点 先看看题目代码: function Foo() { getNam ...
- js面试题Foo.getName()的故事
首先声明下:此题是本人面试时笔试题中的一道,回来一搜居然雷同,纯属偶然,特写此篇来整理一下思绪... 原题: function Foo() {getName = function () { conso ...
- Java经典面试题一
转载自 Java经典面试题一 题目一 面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1.抽象: 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽 ...
- C++经典面试题(最全,面中率最高)
C++经典面试题(最全,面中率最高) 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与fre ...
- 经典面试题(52):以下代码将输出的结果是什么?
web前端教程 用大白话,来讲编程 我们先来回顾上一题<经典面试题(51)>.看投票结果,正确的答案是选项:C,绝大部分同学选对了! 有疑惑的同学,可以看看下面@方呵呵 和 @弓备 给我们 ...
- 经典面试题(36):以下代码将输出的结果是什么?
web前端教程 用大白话,来讲编程 我们先来回顾上一题<经典面试题(35)>.看投票结果,正确的答案是选项:B,绝大部分同学选对了! 看看下面这2位小伙伴 @弓备 和 @lita 给我们带 ...
- 经典面试题(25):以下代码将输出的结果是什么?
我们先来回顾上一题<经典面试题(24)>.看投票结果,大部分小伙伴都选择了错误的选项! 正确的答案是选项:C ["foo","foo"].为什么是C ...
最新文章
- JVM命令查看与设置参数
- SQL Server远程部署
- 实例54:python
- kafka之六:为什么Kafka那么快
- 上市之前再被爆出安全问题 卫龙辣条被爆吃出“锁精环”
- alibaba/Sentinel 分布式 系统流量防卫兵
- groupdel 删除用户组
- 2018最新qq的服务器地址,腾讯QQ2018正式版新功能详细介绍
- BackgroundWorker类的使用例程
- 视频无缝续播的一些解决方案
- 【第八期送书活动】+ 购书福利
- 继电器分类及性能对比
- Qt国际化详细步骤(手把手教你如何国际化)
- C# 后台GC 的前因后果
- 北京理工大学22计算机考研初试成绩公布了吗?
- java数据之头尾链表
- 如何在Python中用集合实现随机的1~100的20个数字
- GBA的内存其实很大
- GitHub 优秀的 Android 开源项目——转自多篇网络文章
- 三七互娱后端工程师笔试记录
热门文章
- Emacs Stardict
- WebRTC-Failed to set remote answer sdp: The order of m-lines in answer doesn‘t match order in offer.
- 那些值得一看的数学电影!
- 我国电子商务五大发展阶段
- 二氧化硅改性活性炭|SiO2改性的V2O5-MoO3/TiO2催化剂|SiO2改性MCM-22分子筛上联苯|纳米SiO2改性环氧涂层海洋腐蚀规律
- 应用技术大公开系列Q之十四:(润滑).石墨烯润滑油制备工艺 (*4-2)
- 【华为OD统一考试B卷 | 100分】5键键盘(C++ Java JavaScript Python)
- Cynthia问题、任务、缺陷管理系统
- 物联网发展预期与展望
- 用vue去实现百度下拉菜单