JavaScript面试难题:解析getName的七种调用情况
184 浏览量
更新于2024-08-30
收藏 169KB PDF 举报
"极易被忽视的javascript面试题七问七答"
这道JavaScript面试题旨在测试面试者对语言核心概念的理解,包括变量提升、`this`的指向、运算符优先级、原型链、继承以及全局变量污染等。下面将详细解答这七个问题。
**第一问**
`Foo.getName()`会调用`Foo`对象上的静态方法,输出2。
**第二问**
`getName()`由于在全局作用域中,这里访问的是作为变量声明的`getName`,它是一个函数,输出4。
**第三问**
`Foo().getName()`首先执行`Foo`函数,`Foo`内部定义了`getName`局部变量,覆盖了外部的`getName`函数,因此调用`getName`时输出1。
**第四问**
第二次调用`getName()`,由于之前已经执行过`Foo`,全局的`getName`已经被赋值为1的匿名函数,所以再次输出1。
**第五问**
`new Foo.getName()`这里`new`操作符优先级高于`.`,所以`new`不会作用于`Foo.getName`,而是直接调用`Foo.getName`,输出2。
**第六问**
`new Foo().getName()`这里`new`操作符用于`Foo`,创建了一个新的实例,实例的`__proto__`指向`Foo.prototype`,因此调用`getName`输出3。
**第七问**
`new new Foo().getName()`与第六问类似,但多了一层`new`,不过这个新的`new`并不会影响到`getName`的调用,因为它是从实例上调用的,所以仍然输出3。
**知识点解析:**
1. **变量提升(Hoisting)**:JavaScript会把变量声明提升到当前作用域的顶部,因此`var getName`的声明在执行时被提前。
2. **`this`的指向**:`this`的值取决于函数调用的方式。在`Foo`内部,`this`指向`Foo`的实例;作为对象属性或方法调用时,`this`指向该对象;而全局中,`this`指向全局对象(在浏览器中是`window`)。
3. **运算符优先级**:`new`的优先级高于`.`,所以在`new Foo.getName()`中,`new`优先执行。
4. **原型(Prototype)**:`Foo.prototype`允许我们添加方法到`Foo`的实例,`Foo.prototype.getName`会被所有`Foo`的实例继承。
5. **继承**:`new Foo()`创建的新实例继承自`Foo.prototype`,所以可以访问`Foo.prototype`上的方法。
6. **全局变量污染**:`var getName`定义了一个全局变量,覆盖了可能存在的同名函数。
7. **函数声明和函数表达式**:`function getName() {...}`是函数声明,会被提升,而`var getName = function() {...}`是函数表达式,只会在执行到该行时赋值。
8. **构造函数**:`function Foo()`是一个构造函数,可以用来创建对象实例。
理解这些知识点对于深入掌握JavaScript至关重要,它们在实际开发中经常出现,且容易引发错误。面试者在面对这样的问题时,应能快速识别并解释每个部分的工作原理。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2024-05-27 上传
weixin_38696582
- 粉丝: 5
- 资源: 953
最新资源
- AhoCorasick:Aho-Corasick字符串搜索算法PHP实现。 来自https://gerrit.wikimedia.orggAhoCorasick的镜像-我们的实际代码由Gerrit托管(请参阅https:www.mediawiki.orgwikiDeveloper_access以进行贡献)
- music-m:React,网易云音乐第三方Web端,:musical_note:
- lista-exercicios-js:使用JavaScript
- traktion:使用Trakt.tv API v2的服务器端应用程序的ORM样式客户端
- emacs-plsense:为Perl提供全方位的完成
- 算法:CC ++中的数据结构和算法
- javascript30
- js代码-这是一段测试代码
- nano-4.1.tar.gz
- Project1-Arif-XIRPL1
- grillode:一个用CoffeeScript为Node.js编写的基于Web的聊天应用程序
- dart_crypto:[Flutter]本项目基于Flutter_macos_v0.5.8-dev版本采用Dart语言开发。`DYFCryptoProvider`集成了Base64、3216 Bits MD5,AES,RSA等算法。(此Flutter项目是基于flutter_macos_v0.5.8以Dart语言开发的。 -dev。“ DYFCryptoProvider”集成了Base64、3216位MD5,AES和RSA算法。)
- GoSlurp:轻量级SQS消费实用程序,用于将消息持久存储到数据存储中
- theme-Ceara
- hemasrinim.github.io
- java代码-定义一个一维数组,求出数组的最大值,最小值,平均值。