[译]前端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请求,浏览器 ...
随机推荐
- 【JMedia】诺贝尔奖得主:东亚教育浪费了太多生命
10月3日,2016年诺贝尔奖开奖第一天,日本科学家大隅良典获得诺贝尔生理学或医学奖.进入21世纪,日本科学家获奖人数快速增长.包括物理奖8位.化学奖6位.生理学或医学奖3位,共计17位,平均下来差不 ...
- 使用VSCode和VS2017编译调试STM32程序
近两年,微软越来越拥抱开源支持跨平台,win10搭载Linux子系统,开源VSCode作为跨平台编辑器,VS2017官方支持了Linux和嵌入式开发功能. ST也是,近两年开发的软件工具基本都是跨平台 ...
- Activiti简介
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术 ...
- nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息
思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...
- Java NIO 之 Socket Channel
在Java NIO中用Channel来对程序与进行I/O操作主体的连接关系进行抽象,这些IO主体包括如文件.Socket或其他设备.简而言之,指代了一种与IO操作对象间的连接关系. 按照Channel ...
- htmlcss渐变及兼容性
自我总结,欢饮拍砖. <!DOCTYPE HTML> <html lang="en"> <head> <meta content ...
- spark头脑镜像
思考是一件有意思的事情.遇到问题,思考出结论,那么脑子里面的过程是什么呢,或者脑子里面是什么呢.我一直认为,这团团的里面是一个模糊的n维空间.理解一个复杂的系统.公式.算法,都要在这个n维空间里具象化 ...
- spring中Bean对象的生命周期
经过测试对于具体的一个Bean,执行的流程应该是: 1.实例化: 常见的有构造(有参.无参)实例化.静态工厂(方法是静态,通过类名.方法返回获取).实例工厂(专门有个类负责生产对象,需要在bean中配 ...
- Trusted Execution Technology (TXT) --- 度量(Measurement)篇
版权声明:本文为博主原创文章,未经博主允许不得转载.http://www.cnblogs.com/tsec/p/8413537.html 0. 导读 TXT基本原理篇介绍了TXT安全度量的基本概念,包 ...
- iOS-CoreText的那些事【电子书的那些事】
这段时间在搞电子书,把这些天出现的问题归总下,我还是希望电子书的格式包括返回的数据,可直观的反应出客户端想表达的内容:原生的体验还是比较好的,希望对coretext再深入. 1.判断点击的位置是否在某 ...