一 .堆和栈和上下文栈
1)栈的分配与释放:
栈空间的分配:
1,全局栈:当js代码运行时就会产生一个全局的执行上下文(全局栈)
2,局部栈:当调用一个函数就产生了一个局部栈空间(也叫局部上下文)。在局部的栈空间完成形参的赋值,声明的提升,代码的执行。
栈空间的释放:全局栈的释放,当JS代码执行完毕,关掉页面时,全局的栈内存就会被释放。
局部栈的释放:(1):当函数调用完毕后(执行完毕),此时的函数栈就会被释放
(2)死递归(函数自己调用自己,并且没有出口),对应的栈内存不会被释放,就会产生爆栈。
(3) 闭包:如果一个变量还在引用这这个栈内存,此时这个栈也不会被释放,并且这个栈内存中的数据也会被保存下来。
2)堆的分配与释放:
堆空间的分配:当一个数据是引用数据类型时,会把这个数据存储在堆空间。
堆空间的释放:当没有变量来引用,这个堆运行结束就释放掉这个堆空间·
3)上下文栈的概念:
先进后出,后进先出(就像杯子里面放鸡蛋,先放进去的,最后才能拿出来)
栈内存:一个内存空间
栈结构:一种数据存储结构(先进后出,杯子里面放鸡蛋)
二.Let声明变量的特点
(1)let不能重复声明
(2)let和{}会产生一个块级的作用域
(3)let声明的变量名,不能被提升
(4)let声明的变量不属于window对象的属性
三.js代码执行中几种错误的小细节
使用var和不使用var和let一起一些问题,使用let声明从还没执行到它就在内存中有了,但是不提升。所以有些问题还是要注意。
几种错误自己慢慢品:语法错误,引用错误,范围错误,类型错误。
ReferenceError引用错误有两种:第一种:Uncaught ReferenceError: a is not defined
console.log(a)
a=110; //内存中没有,输出一个不存在变量
ReferenceError引用第二种错误:Uncaught ReferenceError: Cannot access 'a' before initialization
console.log(a);
let a=110;//内存中已经有a这个变量了,但是let的声明不会被提升,输出的时候会提示的内存中已定义但是不能引用
SyntaxError语法错误示范一:Uncaught SyntaxError: Unexpected token ')'
if(a>=3)){
console.log(a)
} //普通语法错误
SyntaxError语法错误示范二:Uncaught SyntaxError: Identifier 'a' has already been declared
let a=110;
var a=123;
console.log(a) //let声明的变量不能重复声明
TypeError类型错误示范一:Uncaught TypeError: a is not a function
var a=110;
a();
TypeError类型错误示范二:Uncaught TypeError: a is not a function
var arr=[1,2,3,4]
arr()
RangeError范围错误示范一:Uncaught RangeError: Invalid array length
var arr=new Array(1000000000000000000000000000)
console.log(arr)//数组长度范围不能太大,超出了数组长度的范围
RangeError范围错误示范二:Uncaught RangeError: Invalid array length
var arr=new Array(-2);
console.log(arr)//数组长度范围不包括负,再说了长度怎么可以是负值呢,超出了数组长度的范围