文章目录
JS 有哪些垃圾回收机制?
说说你对闭包的理解
为什么不建议在 JavaScript 中使用 innerHTML?
null和undefined的区别是什么?
new 操作符的作用是什么?
JS 有哪些垃圾回收机制?
:有以下垃圾回收机制。
●标记清除(markandsweep)
这是JavaScript 最常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境”。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。
●引用计数( reference counting )
在低版本的IE中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。当声明了一个变量并将一个引用类型赋值给该变量的时候,这个值的引用次数就加1。 如果该变量的值变成了另外一个,则这个值的引用次数减1。当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问。因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值占用的空间。
在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。也就是说,只要涉及BOM和DOM,就会出现循环引用问题。
说说你对闭包的理解
使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域。
闭包有3个特性。
(1)函数嵌套函数。
(2)在函数内部可以引用外部的参数和变量。
(3)参数和变量不会以垃圾回收机制回收。
为什么不建议在 JavaScript 中使用 innerHTML?
:通过innerHTML 修改内容,每次都会刷新,因此很慢。
在innerHTML 中没有验证的机会,因此更容易在文档中插入错误代码,使网页不稳定。
null和undefined的区别是什么?
null是一个表示、“无”的对象,转为数值时为0; undefined 是一个表示、“无”的原始值,转为数值时为NaN。
当声明的变量还未初始化时,变量的默认值为undefined.
null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
(1)如果变量声明了,但没有赋值,它就等于undefined.
(2)当调用函数时,如果没有提供应该提供的参数,该参数就等于undefined.
(3)如果对象没有赋值,该属性的值为undefined.
(4)当函数没有返回值时,默认返回undefined.null表示“没有对象”,即此处不应该有值,
典型用法是如下
(1)作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。
new 操作符的作用是什么?
:作用如下。
(1)创建一个空对象。
(2)由this变量引用该对象。
(3)该对象继承该函数的原型(更改原型链的指向)。
(4)把属性和方法加入到this引用的对象中。
(5)新创建的对象由this引用,最后隐式地返回this, 过程如下:
var obj={};
obj._proto_=Base.prototype;
Base.cail(obj)