前言
前两篇文章给大家介绍了一些js系列常考的题目,这篇文章接着继续,希望对大家有所帮助。
前端面试必考八股文之——js系列(1)
当面试官让你谈谈深浅拷贝,你怎么说?
1. 说一说你对闭包的理解
是什么
当一个函数中的内部函数被拿到函数外部调用,又因为在js中内层作用域总是能访问外层作用域的变量,那么内部函数存在对外部函数中变量的引用,这些变量的集合称之为闭包。
function foo() {
let a = 1
let b = 2
function bar() {
console.log(a); // 这里的a就是闭包
}
return bar
}
let baz = foo()
baz() // 1
- 应用场景
- 创建私有变量 (全局变量不易维护)
- 延长变量的生命周期
- 实现柯里化(颗粒)
- 缺点
内存泄露:函数的执行上下文销毁的不彻底,内存空间变小
2. 什么是柯里化(颗粒化)
是什么
将一个接受多个参数的函数转变成多个只接受一个参数的函数
function add(a, b, c) {
return a + b + c
}
function add(a) {
return function(b) {
return function(c) {
return a + b + c
}
}
}
const res = add(1)(2)(3)
console.log(res); // 6
3. 说说你对作用域的理解
是什么
变量和函数能够生效的区域,这个区域叫作用域有哪些(类型)
全局作用域
在V8执行代码的过程中会进行预编译,预编译会生成一个全局执行上下文, 这个全局执行上下文就是全局作用域,里面定义了声明在最外层的变量和函数函数体作用域
在代码的执行过程中,遇到函数的调用时会生成一个函数的执行上下文,这个函数执行上下文就是函数体的作用域,里面定义了声明在函数内部的变量和函数块级作用域
let或const和{}形成的区域就叫做块级作用域
-
作用域链:作用域只能从内到外的访问,这种访问规则形成的链状关系我们称之为作用域链
-
词法作用域:指的是函数或变量定义的区域
4. 说说你对原型的理解
- 是什么
-
显式原型:指的是函数身上自带的prototype属性,箭头函数没有这个属性 通常可以将一些属性和方法添加在显式原型上,可供实例对象继承到 -
隐式原型:__proto__是对象这种结构上的一个属性,其中包含了创建该对象时隐式继承到的属性
原型链:创建一个实例对象时,实例对象的隐式原型等于创建该实例对象的构造函数的显式原型,在js中对象的属性的查找规则是先在对象中查找,找不到再去对象的隐式原型上查找,顺着隐式原型一层层往上找,直到找到null为止,这种查找规则我们叫原型链应用场景:可以用来实现属性的继承
function Foo(name) {
this.name = name
}
Foo.prototype.age = 18
let foo = new Foo('john')
// foo的结构是这样的
// {
// name: john,
// __proto__: {
// age: 18
// }
// }
// 刚好验证了实例对象的隐式原型等于创建该实例对象的构造函数的显式原型
console.log(foo.age); // 18
// 利用原型实现属性的继承
Car.prototype = {
name: '宝马',
width: 1800,
height: 50
}
function Car(color) {
this.color = color
}
let car = new Car('green')
console.log(car.name,car.color); // 宝马,green
结语
最近忙着面试,后面可能会给大家更新面经,敬请期待哦~