JS基础三(常见问题及答案)
JS常见问题及答案
说明
EC:执行上下文
AO:活动对象(存储了局部执行上下文中的数据)
VO:变量对象(存储全局执行上下文中的数据)
GO:全局对象 window
ECStack:执行上下文栈
Scope:作用域
1.什么是代码段?
使用script标签包起来的就是代码段
特点:上一个代码段定义的状态,在下一个代码段中可以使用
2.JS代码执行分几个阶段?
预编译:
1.扫描代码段,如果代码有语法错误,停止一切工作,立即报错
2.提升:
(1)加var变量提升
全局代码:提升代码段最前面
局部代码:提升局部代码最前面
(2)函数定义提升
代码执行
一行一行执行代码
3.JS中的数据类型和数据存储?
为了更加合理的使用内存,提出了数据类型
基本数据类型:
number string boolean undefined null
存储在栈区(栈区保存了堆区的地址)
引用数据类型:
object array function
存储在堆区
4.加var和不加var变量的区别?
- 加var的会提升
- 不加var的存储在GO中
- 不加var的只能作为全局变量
5.什么是作用域链?
作用域链说的是数据的查找机制,找一个数据,先在自己的EC中找,找不到,去父函数所在的EC中找,如果还找不到,就去父函数的父函数EC中找,直到找到全局EC,如果还找不到,就报错。
6.什么是EC?
全局代码执行时产生全局的EC,调用一个函数时,就产生一个局部的EC。EC是放在一个栈结构中的,全局的EC,先入栈,调用一个函数,局部的EC也入栈,函数调用完毕,局部EC就出栈,全局代码执行完毕,全局EC也出栈。
7.什么是闭包(closure)
一个不能被销毁的执行上下文就是一个闭包,它有两大作用:
(1)保护:位于闭包的数据,外界不能访问
(2)保存:EC出栈了,数据没有销毁,数据的生命周期延长
缺点:造成内存空间的泄露,要合理使用闭包
8.JS中的错误分类
- 语法错误 JS代码在预编译时就发现了错误
特点:
1.代码没有机会执行
2.错误容易发现
function(){
}
//会报错:Uncaught SyntaxError: Function statements require a function name
- 引用错误:通常访问一个没有定义的变量就会发生引用错误
解决办法:先定义好变量,再使用
特点:JS代码在执行的时候,才会发现引用错误,错误之后的代码不执行
console.log(a);
//会报错:Uncaught ReferenceError: a is not defined
- 类型错误:
使用类型不当,提供的数据,不是JS想要的
也是JS代码在执行时才会发现,类型错误之前的代码会执行,之后的不执行
var f = 110;
f();
//会报错:Uncaught TypeError: f is not a function
- 范围错误:
使用容器不当
// 定义一个数组
var arr = ["a","b","c"]; // 定义数组方式1
var arr2 = new Array(10); // 定义数组方式2 10表示数组中可以存储10个数据
var arr3 = new Array(-5);
//会报错:Uncaught RangeError: Invalid array length
- 上面4类错误,在控制台都会报错,还有一类错误,控制台不会报错,叫逻辑错误,可以通过debugger调试错误。
9.异常处理
异常不是错误,异常是指可能出错的代码。
语法:
try{
// 放可能出错的代码
}catch(e){
// 如果上面的代码错误了,就到这里进行错误的处理,其中e表示错误对象
// 它里面包含了错误信息。通过查看e,可以知道它到底出了什么错误
}finally{
// 无论对错,代码都会执行到此处,在JS中用的不多
}
10.逻辑与,或,非
- 逻辑与 && 双元运算符 有两个操作数
只有两个操作数都是真 整体的结果才为真
console.log(true&&true)//true
console.log(false&&true)//false
console.log(true&&false)//false
console.log(false&&false)//false
- 逻辑或 || 双元运算符 有两个操作数
只要有一个操作数为真,整体的结果就为真
console.log(true||true)//true
console.log(false||true)//true
console.log(true||false)//true
console.log(false||false)//false
- 逻辑非 ! 单目运算符 1个操作数
如果为真 整体就是假 如果为假 整体就是真
console.log(!true); // false
console.log(!false); // true
本文地址:https://blog.csdn.net/weixin_46628546/article/details/107472669