1.什么叫暂时性死区
在es6中,一个作用域内不允许变量在定义前使用。
在es6中,变量在被定义前时不允许访问的知道遇到定义变量的语句开始才能被访问,不能被访问的区域就是这个变量的暂时性死区。
在预编译过程中,当作用于内的变量实际上就已经确定了,只不过在遇到定于它的语句之前,不允许被访问,这就叫做暂时性死区。
2.什么叫变量声明提升
es5中,在预解析阶段,程序会将当前作用域内的所有变量声明提升到最开始执行,这就叫变量声明提升。
函数声明优先于变量声明
fn();
function fn(){
console.log(1);
}
var fn = function(){
console.log(2);
}
3.解释上下文的生命周期及创建阶段做的事情
执行上下文的生命周期:
创建、执行、回收
创建:
1. 确定参数和变量
2. 确定作用域链
3. 确定this指定方向
4.什么是闭包,闭包的好处和坏处时声明?
广义上:在一个作用域内通过某种方式(函数、对象等等)打包一个局部作用域的过程就叫做闭包,所有的函数都是闭包函数;
狭义上:我们在一个作用域内用函数打包一个小的作用域并将这个函数返回出去,供其他作用域使用的过程叫做闭包。
好处:
1. 可以让外部访问内部的变量
2. 可以将数据打包到函数内,且形成单向数据流
坏处:
容易造成内存泄漏
5.说明用递归解决问题的两个关键点是什么?
1、一个问题可以分解为几个子问题的解。
2、这个问题和分解后的子问题除了数据规模不一样,解题思路完全一样。
3、必须存在明确的终止条件。
6.说明立即执行函数表达式的原理及基本结构是什么?
让js将函数声明以函数表达式的方式来运行。
+function(){
}();
执行且只执行一次。
+function(n){
}(123);
7.说明js内存的栈内存和堆内存各自有什么特点?
栈内存:
1、存储的数据格式(大小)固定。
2、总尺寸比较小。
3、后进先出的原则,读取访问速度快。
4、通常用来存储 值类型、执行上下文、内存地址。
堆内存:
1、尺寸比较大,存储数据不限定尺寸。
2、数据存储采用树形结构,访问速度相对较慢。
3、通常用来存储引用类型的数据。
8.请简述var和let的区别?
Var 是es5定义变量的方法,let是es6的定义变量的方法
Var定义的变量存在变量声明提升,Let定义的变量存在暂时性死区
Var定义的变量只有全局和函数作用域,没有块级作用域,Let定义的变量存在块级作用域
Let不能重复定义,var可以重复定义。
9.请谈谈你对变量提升和函数提升的理解?
Es5使用var定义的变量在程序执行时,会优先将定义变量的过程提升到最开始。
使用函数声明定义变量时,函数的声明及变量的赋值都会被提升到最开始。
当变量名和函数名相同时,因为函数声明提升还有赋值的过程,所以,优先于变量声明提升。
10.内存分为几个区域,各区域存储什么样的数据,特点是什么?
栈内存、堆内存、代码内存
1.栈内存存储的总大小比较小,存储的数据大小固定,采用后进先出的方式,访问速度快,通常用来存储值类型的数据及引用(内存地址,指针),执行上下文。
2.堆内存的存储大小比较大,存储数据大小不固定(树状结构存储),先进先出,访问速度慢。通常用来存储引用类型(对象类型)的值。
11.函数fn分别使用call,apply,bind改变this指向位obj,并传入参数1,2,3?
Fn.call(obj,1,2,3);
Fn.apply(obj,[1,2,3]);
Fn.bind(obj)(1,2,3);
12.请说明this指向问题?
- 全局作用域中的函数:非严格模式下其内部this指向window
- 对象内部的函数:其内部this指向对象本身
- 构造函数:其内部this指向生成的实例
- 由apply、call、bind改造的函数:其this指向第一个参数
- 箭头函数:箭头函数没有自己的this,看其外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有,则this是window。(函数定义时的this,而不是调用时this)
13.写出class的继承的关键代码
1. Class a{
Constructor(){
}
}
2. Class b extends a{
Constructor(){
Super();
}
}
14.请简述浅拷贝和深拷贝的区别,并说明实现深浅拷贝各有几种方式
- 浅拷贝时只拷贝对象的引用,深拷贝是音乐及数据都拷贝
- 当对象的值还是对象时,拷贝的过程如果只对第一级深拷贝,之后都是浅拷贝,我们叫做浅拷贝,对所有级别都进行深拷贝,才叫深拷贝
深拷贝的方式:JSON.parse(JSON.stringgify(obj))
浅拷贝的方式:[...arr] arr.concat([]) Object.assign({},obj1){...obj1}
15.构造函数如何生成对象,对象如何获取原型对象,构造函数如何获取原型对象?
使用new关键字new函数();
__proto__
prototype
16.对象的创建方式有哪些?
New Object()
{}
Object.create()
Object.assgin()
17.输出以下代码的结果
function foo(fn) {
let b = fn();
let c = b + 1;
return function () {
return c + 8;
}
}
let result = foo(function () {
return 1 + 2;
});
let r = result();
console.log(r);
r = 12
18.输出以下代码的结果
function Setcount(count) {
this.count = count;
}
Setcount.prototype.printCount = function () {
console.log(this.count);
console.log(this);
}
let a = new Setcount(10);
a.count = 20;
a.__proto__.count = 300;
a.__proto__.printCount();
a.printCount();
第一个:300 a.__proto__
第二个:20 a
19.以下函数执行结果
var F = function () { };
Object.prototype.a = function () {
console.log('a()')
}
Function.prototype.b = function () {
console.log('b()')
}
var f = new F();
分别执行:
f.a(): a()
f.b(): undefined
F.a(): a()
F.b(): b()
持续更新中.......(更不动了,不干了)