js高级技巧第三天

一 .堆和栈和上下文栈

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)//数组长度范围不包括负,再说了长度怎么可以是负值呢,超出了数组长度的范围

猜你喜欢

转载自blog.csdn.net/zwy1231/article/details/103399969