[译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
最近将持续翻译JavaScript面试题,希望对各位有所帮助。
(文章中斜体字部分为译者添加)
目录:
Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)....即将发布
1、解释事件委托
事件委托是一种向父级元素增加事件监听器,而不用向子级元素一个个添加的技术方案。监听器将在会DOM事件冒泡到父级元素时被触发。事件委托有以下优势:
- 因为我们只需要在父级元素上添加一个监听器,而不用在每个子元素上添加,所以JS的内存占用会降低很多。
- 当子元素有移除(或新增)时,我们不用单独移除(或添加)其事件监听器。(注:也就是我们常说的动态绑定)
参考文档:
https://davidwalsh.name/event-delegate
https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation
2、解释JavaScript中的this工作原理
关于this其实没有一个统一的解释,它算是JavaScript中最让人困惑的一个概念了。一种通俗的解释就是,this的取值依赖于函数被谁调用。我在网上看过很多关于this的解释,其中Arnav Aggrawal 的解释应该是最为清楚的,以下是他的观点:
- 如果是使用new关键字来调用函数,那么函数内部的this就是一个全新的对象。
- 如果使用apply、call或者bind来调用一个函数,函数内部的this就将指向传入的第一个参数。(注:使用这几个方法可以改变this的指向)
- 如果函数被作为一个方法进行调用,比如:obj.method() --- 那么this就该函数的调用者。(注:样例中的obj)
- 如果函数被独立调用,也就是没有被上述的几种情况调用。(比如:method())这种情况,this将指向于一个全局对象,在浏览器中是window对象。(nodejs环境中是global)如果是使用严格模式的话,那么全部对象将会是undefined。
- 如果使用了上述多条规则的话,那么排序靠前的将优先控制this的指向。
- 在ES2015中的箭头函数,将会忽略上述的所有规则,而将取决与函数创建时的作用域。(箭头函数的作用域在创建时就已经确定,不能更改。想想真是问题终结者...)
关于this更深一层的介绍,请参考:article on Medium
引用文档:
https://codeburst.io/the-simple-rules-to-this-in-javascript-35d97f31bde3
https://stackoverflow.com/a/3127440/1751946
3、解释原型链的原理
这是一个在面试中经常被问到的问题。JavaScript中的所有对象一个叫prototype的属性,这个属性指向于另一个对象。当需要访问一个对象上的某个属性时,如果在自身对象上没有找到该属性的话,JS引擎会在对象的prototype上进行查找,找不到的话会继续在prototype的prototype对象,依次类推直至在某个prototype上找到该属性,或者到达原型链尽头时停止。JS的这种行为和传统的继承概念很像,但原型链的内容远不止于此,更多内容请查看:delegation than inheritance
引用文档:
https://www.quora.com/What-is-prototypal-inheritance/answer/Kyle-Simpson
https://davidwalsh.name/javascript-objects
4、如果看待AMD和CommonJS
这两个都可以实现模块系统,模块系统在ES2015没有发布之前并没有被原生JavaScript所支持。CommonJS是同步的,AMD(Asynchronous Module Definition)是相对异步的。CommonJS的设计初衷是应用在服务端,而AMD主要用在客户浏览器端,因为它可以支持异步加载模块。
另外在语法层面,我也发现AMD相对比较轻量化,而CommonJS更接近别的开发语言中导入模块的写法。大多数时候,AMD还是比较冗余的,因为它会导入所有的JavaScript代码到你的入口文件中,这样反而使我们不能从异步加载中受益。(比如我只需要lodash/map,但AMD会把整个lodash加载进来) CommonJS的语法更为接近Nodejs模块的编写方式,在服务端和客户端开发时,使用方式区别并不大。
值得庆幸的是ES2015的到来,它可以同时支持同步与异步模块加载,使得我们有了一个统一的解决方案。但目前ES2015的模块系统还没有被完全支持,所以我们需要使用一些转换器将ES6编译为ES5。
引用文档:
https://auth0.com/blog/javascript-module-systems-showdown/
https://stackoverflow.com/questions/16521471/relation-between-commonjs-amd-and-requirejs
5、function foo(){}(); 为什么这个表达是不是一个IIFE,要如何修改?
IIFE的意思是自执行函数表达式。JavaScript引擎将会把上面的代码看着是function foo(){}和(),也就是说前面是一个函数声明,后面的()是尝试去执行这个函数,但是由于没有执行的函数名,所以这里会抛出异常:Uncaught SyntaxError: Unexpected token )。
有两个通过增加括号的方法去修复上面的问题:(function foo(){}()) 以及 (function foo(){}())。这种函数并不会暴露在全局作用域中,你甚至还可以把函数名也去掉,只保留函数体本身。(即匿名函数:(function (){}()) )
引用文档:
http://lucybain.com/blog/2014/immediately-invoked-function-expression/
[译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)的更多相关文章
- 前端JS面试题汇总 Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- 2016 JS 笔试题汇总:
1 1 1 CS&S(中软国际): 1 JavaScript 循环表达式: 2 JavaScript表达式boolean返回值: 3 网页中的事件/HTML 事件属性/JavaScript ...
- WEB前端常见面试题汇总:(一)
1.JS找字符串中出现最多的字符 例如:求字符串'nininihaoa'中出现次数最多字符 方法一: var str = "nininihaoa"; var o = {}; for ...
- 前端 | JS 任务和微任务:promise 的回调和 setTimeout 的回调到底谁先执行?
首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么? console.log("script start"); setTimeout(function () { con ...
- 【JS档案揭秘】第三集 深入最底层探秘原型链
关于这部分我看过大量的文章,数不胜数,包括阮一峰的继承三部曲,还有各种慕课的视频教程,网上无数继承方法的对比.也对很多概念存在长期错误的理解.今天做一个正确的总结,用来给原型链和继承这块知识画上句号, ...
- 一道常被人轻视的前端JS面试题
前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多 ...
- 一道常被人轻视的前端JS面试题(转)
分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多难只是因为大多面试者过 ...
- web前端常见面试题汇总
一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器 ...
随机推荐
- RocketMQ-事务消费
理论部分在https://www.jianshu.com/p/453c6e7ff81c中的 "三.事务消息".下面从代码层面看一下rockemq的事务消息 一.事务消费端. 从代码 ...
- python_如何让字典保持有序?
案例: 某编程竞赛系统,对参赛选手编程解题进行计时,选手完成题目后,把该选手解题用时记录到字典中,以便赛后按选手名查询成绩(答题时间越短,成绩越优秀) {'lili':(1,43),'yuyu':(2 ...
- common-logging源码解析
OK,现在我们来研究下common-logging的源码.这篇博客有参照上善若水的博客,感谢他的无私分享. 先来随便扯点吧,貌似所有这些流行的Logging框架都和Log4J多少有点关系(不太确定Co ...
- Linux指令--/etc/group文件
Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...
- 谈谈JAVA程序的反编译
如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库.多媒体.CGI.及动态网页的制作方面.1999年在美国对JAVA程序员的需求量首次超过C++! 最近分析一些 ...
- Netty初探
匠心零度 转载请注明原创出处,谢谢! 说在前面 为什么我们需要学习netty?谈谈自己的看法,由于本人水平有限,如果有那里不对,希望各位大佬积极指出,欢迎在留言区进行评论交流.探讨. 由于移动互联网的 ...
- 通过反编译深入理解Java String及intern(转)
通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...
- JavaScript动画:offset家族和匀速动画详解(含轮播图的实现)
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset家族简介 我们知道,三大家族包括:offset/scroll ...
- ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容.下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了. 其 ...
- spring之集合注入
list: <bean id="userAction" class="com.xx.action.UserAction"> <property ...