上一篇 前端面试题-JavaScript(一), 感兴趣的小伙伴也能够移步这里查看 完整版JavaScript面试题,面试题会不按期更新加进去一些我的工做中遇到的或者认为比较重要的东西,后面会涉及到前端的各个方面,感兴趣的小伙伴能够关注哦!javascript
若是文章中有出现纰漏、错误之处,还请看到的小伙伴留言指正,先行谢过html
如下 ↓前端
同步模式
同步模式,又称阻塞模式。javascript
在默认状况下是会阻塞加载的。当前面的 javascript
请求没有处理和执行完时,会阻止浏览器的后续处理java
异步模式
异步加载又叫非阻塞,浏览器在下载执行 js
同时,还会继续进行后续页面的处理nginx
异步加载 JavaScript
script
标签defer
async
defer
属性和async
都是属于script
标签上面的属性,二者都能实现JavaScript
的异步加载。不一样之处在于:async
在异步加载完成的时候就立刻开始执行了,defer
会等到html
加载完毕以后再执行
因为浏览器的 同源策略,在出现 域名、端口、协议有一种不一致时,就会出现跨域,属于浏览器的一种安全限制。
解决跨域问题有不少种方式,经常使用的就是如下几种:git
jsonp
跨域:动态建立script
,再请求一个带参网址实现跨域通讯.缺点就是只能实现 get
一种请求document.domain + iframe
跨域:两个页面都经过js强制设置document.domain
为基础主域,就实现了同域.可是仅限主域相同,子域不一样的跨域应用场景Access-Control-Allow-Origin
便可,前端无须设置,若要带cookie
请求:先后端都须要设置nginx
反向代理接口跨域:同源策略是浏览器的安全策略,不是HTTP
协议的一部分。服务器端调用HTTP
接口只是使用HTTP
协议,不会执行JS脚本,不须要同源策略,也就不存在跨越问题WebSocket
协议跨域在 JavaScript
中,研究 this
通常都是 this
的指向问题,核心就是 this
永远指向最终调用它的那个对象,除非改变 this
指向或者箭头函数那种特殊状况es6
function test() { console.log(this); } test() // window var obj = { foo: function () { console.log(this.bar) }, bar: 1 }; var foo = obj.foo; var bar = 2; obj.foo() // 1 foo() // 2 // 函数调用的环境不一样,所获得的结果也是不同的
相同点:三者均可以改变 this 的指向github
不一样点:web
var obj = { name : 'sss' } function func(firstName, lastName){ console.log(firstName + ' ' + this.name + ' ' + lastName); } func.apply(obj, ['A', 'B']); // A sss B
call
方法第一个参数也是做为函数上下文的对象,可是后面传入的是一个参数列表,而不是单个数组var obj = { name: 'sss' } function func(firstName, lastName) { console.log(firstName + ' ' + this.name + ' ' + lastName); } func.call(obj, 'C', 'D'); // C sss D
bind
接受的参数有两部分,第一个参数是是做为函数上下文的对象,第二部分参数是个列表,能够接受多个参数var obj = { name: 'sss' } function func() { console.log(this.name); } var func1 = func.bind(null, 'xixi'); func1();
apply
、call
方法都会使函数当即执行,所以它们也能够用来调用函数
bind
方法不会当即执行,而是返回一个改变了上下文this
后的函数。而原函数func
中的this
并无被改变,依旧指向全局对象window
面试
bind
在传递参数的时候会将本身带过去的参数排在原函数参数以前
function func(a, b, c) { console.log(a, b, c); } var func1 = func.bind(this, 'xixi'); func1(1,2) // xixi 1 2
内存泄漏:是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束
可能形成内存泄漏的操做:
你可能还须要知道 垃圾回收机制 此外,高程上面对垃圾回收机制的介绍也很全面,有兴趣的小伙伴能够看看
事件代理:通俗来讲就是将元素的事件委托给它的父级或者更外级元素处理原理:利用事件冒泡机制实现的
优势:只须要将同类元素的事件委托给父级或者更外级的元素,不须要给全部元素都绑定事件,减小内存空间占用,提高性能; 动态新增的元素无需从新绑定事件
AMD
和CMD
都是为了解决浏览器端模块化问题而产生的,AMD
规范对应的库函数有Require.js
,CMD
规范是在国内发展起来的,对应的库函数有Sea.js
AMD和CMD最大的区别是对依赖模块的执行时机处理不一样
一、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块二、CMD推崇就近依赖,只有在用到某个模块的时候再去require
ECMAScript 6.0 是 JavaScript 语言的下一代标准
新增的特性:
let
const
includes()
startsWith()
endsWith()
等Array.from()
Array.of()
entries()
keys()
values()
等Object.is()
Object.assign()
entries()
keys()
values()
等rest
参数、函数参数默认值等Set
和 Map
Proxy
Promise
对象async
函数 await
命令Class
类Module
体系 模块的加载和输出方式了解更多,参考 ES6入门-阮一峰
ES6 容许使用“箭头”(=>)定义函数
var f = v => v; // 等同于 var f = function (v) { return v; }
注意点:
this
对象,就是定义时所在的对象,而不是使用时所在的对象new
命令,不然会抛出一个错误arguments
对象,该对象在函数体内不存在。若是要用,能够用 rest
参数代替Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.所谓Promise,简单说就是一个容器,里面保存着某个将来才会结束的事件(一般是一个异步操做)的结果 --ES6入门-阮一峰
Promise
对象表明一个异步操做,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态
特色:
Promise
新建后就会当即执行const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操做成功 */){ resolve(value); } else { reject(error); } })
Promise实例生成之后,能够用then方法分别指定resolved状态和rejected状态的回调函数
promise.then(function(value) { // success }, function(error) { // failure })
then
方法返回的是一个新的Promise实例
Promise.prototype.catch
用于指定发生错误时的回调函数,具备“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误老是会被下一个catch
语句捕获
getJSON('/post/1.json').then(function(post) { return getJSON(post.commentURL); }).then(function(comments) { // some code }).catch(function(error) { // 处理前面三个Promise产生的错误 });
catch
方法返回的仍是一个Promise
对象,所以后面还能够接着调用then
方法
出去上述方法,Promise还有其余用法,小伙伴们能够在这里查看大佬写的文章 ES6入门-阮一峰
async
函数是什么?一句话,它就是Generator
函数的语法糖
了解Generator函数的小伙伴,这里 传送门
async
特色:
async
函数返回一个Promise
对象,可使用then
方法添加回调函数。当函数执行的时候,一旦遇到await
就会先返回,等到异步操做完成,再接着执行函数体内后面的语句
async
函数内部return
语句返回的值,会成为then
方法回调函数的参数
async
函数返回的Promise
对象,必须等到内部全部await
命令后面的Promise
对象执行完,才会发生状态改变,除非遇到return
语句或者抛出错误
async
函数内部抛出错误,会致使返回的Promise
对象变为reject
状态。抛出的错误对象会被catch
方法回调函数接收到
function timeout(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function asyncPrint(value, ms) { await timeout(ms); console.log(value); } asyncPrint('hello world', 50);
await
命令:await
命令后面是一个Promise
对象,返回该对象的结果。若是不是Promise
对象,就直接返回对应的值
async function f() { // 等同于 // return 123; return await 123; } f().then(v => console.log(v)) // 123
await
命令后面是一个thenable
对象(即定义then方法的对象),那么await
会将其等同于Promise
对象.也就是说就算一个对象不是Promise
对象,可是只要它有then
这个方法,await
也会将它等同于Promise
对象
使用注意点:
await
命令后面的 Promise
对象,运行结果多是 rejected
,因此最好把 await
命令放在 try...catch
代码块中await
命令后面的异步操做,若是不存在继发关系,最好让它们同时触发await
命令只能用在 async
函数之中,若是用在普通函数,就会报错了解更多,请点击 这里
export
与export default
都可用于导出常量、函数、文件、模块等在一个文件或模块中,
export
、import
能够有多个,export default
仅有一个经过
export
方式导出,在导入时要加{ }
,export default
则不须要使用
export default
命令,为模块指定默认输出,这样就不须要知道所要加载模块的变量名;export
加载的时候须要知道加载模块的变量名
export default
命令的本质是将后面的值,赋给default
变量,因此能够直接将一个值写在export default
以后
参见 雅虎14条前端性能优化
首选明确两点:
JavaScript
是单线程语言
JavaScript
的Event Loop
是JS
的执行机制, 也就是事件循环
console.log(1) setTimeout(function(){ console.log(2) },0) console.log(3) // 1 3 2
JavaScript
将任务分为同步任务和异步任务,执行机制就是先执行同步任务,将同步任务加入到主线程,遇到异步任务就先加入到event table
,当全部的同步任务执行完毕,若是有可执行的异步任务,再将其加入到主线程中执行
视频详解,移步 这里
setTimeout(function(){console.log(1);},0); new Promise(function(resolve){ console.log(2); for(var i = 0; i < 10000; i++){ i == 99 && resolve(); } }).then(function(){ console.log(3) }); console.log(4); // 2 4 3 1
在异步任务中,定时器也属于特殊的存在。有人将其称之为 宏任务、微任务,定时器就属于宏任务的范畴。
参考 JS引擎的执行机制
总结的过程,本身确实也获益颇多,感谢前行的小伙伴。
GitHub完整版面试题,欢迎小伙伴们star
关注
预祝你们都能找到本身满意的工做
以上