JavaScript高级程序设计—第四章(作用域和内存问题)

前端之家收集整理的这篇文章主要介绍了JavaScript高级程序设计—第四章(作用域和内存问题)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.数据的基本类型和引用类型:基本类型数据存储在栈内存中,操作基本类型数据时时直接对数据的值进行操作。引用类型数据存储在对内存中,但是在栈内存中会有其对应的地址,在操作引用数据类型时,实际上是通过栈内存中的地址进行操作的。

2.不能给基本类型数据添加属性,虽然此操作并不会报错,但是添加属性并不会生效,例如:

添加属性不会生效
console.log(array.name)         // array,array时引用数据类型,实质上也是一个对象,因此可以为其添加name属性

3.函数参数传递问题:js中的函数参数传递的都是值传递,如果参数时基本数据类型,则直接将基本数据类型的值传递到函数,如果参数是引用数据类型,则将数据地址的值(变量中的值本身就是一个地址)传递到函数

obj = new Object();
obj.name = "huahua";
}

setName(person);
console.log(person.name) // dayday

上面代码中,变量person中存储的是一个空对象的地址,将person对象的地址的值传入到setName()函数中,此时setName()函数参数obj的值就是对象的地址(参数obj是person对象的副本,两个独立的值),通过obj.name可以为person对象创建新的属性。但是后面语句obj = new Object();重新让参数obj指向了一个新的对象,此时obj与person对象之间就没有联系了,对obj进行更改不会影响到person了。

4.typeof()函数和instanceof操作符:typeof()函数可以检测基本除null外的基本数据类型,但是不能区分null、array、object。instanceof操作符可以检测引用数据类型的构造函数,由于所有的引用数据类型都是对象,所以在检测所有引用类型数据和Object构造函数时都会返回true,而检测基本数据类型,始终返回false。

5.执行环境:执行环境(执行上下文)就是指js代码在执行时可以访问哪些变量和数据。每个执行环境都有与之对应的变量对象,此变量对象用来保存环境中定义的所有变量和函数,当函数执行完毕后此对象被摧毁。
作用域链:在代码函数)在一个环境中执行时,其变量对象会创建一个作用域链,此作用域链的最前端会放入所有的局部变量,然后再依次放入外部的局部变量,知道将所有的全局变量放入其中,在执行时首先会从作用域的最前端开始查找变量,如果找到则返回值并停止查找,如果没有找到则沿作用域链向后查找。

6.延长作用域:with语句、try catch语句都可以延长作用域,例如:

7.js垃圾回收机制:js中最常用的垃圾回收机制是"标记清除机制",即当一个变量进入执行环境时,则标记为"进入环境",此时此变量不能被回收,一旦变量离开执行环境(执行环境被摧毁)时,则标记此变量为"离开环境",当垃圾回收机制检测到变量标记"离开环境"时则自动回收此变量占用的内存空间,内存得到释放。js垃圾回收机制会周期性的执行垃圾回收这一操作。
引用计数(使用较少):当声明了一个变量并将一个引用类型的值赋值给此变量时,值的引用次数加一,若又将此值赋值给另一个变量时,则值的引用计数再加一,相反若给变量重新赋了一个新的值,则之前值的引用减一。引用计数的缺点是当两个对象存在相互引用时,垃圾回收机制则不能及时清除其占的内存。

8.内存管理:通常情况下js的垃圾清除机制会帮我们自动管理内存,但是有时候也需要我们手动释放内存,以达到内存的优化。比如对于全局变量,只会在系统结束(浏览器关闭退出页面)时才会被回收,如果某个全局变量使用完后就不再需要用到,则我们可以手动回收,回收的方法很简单,就是给此变量赋值null即可。这也是js内存优化的优化的最佳方式。

原文链接:https://www.f2er.com/js/416219.html

猜你在找的JavaScript相关文章