面试题
var、let、const区别
1. var变量挂载到window上
var a=123
console.log(window.a); //123
let b=11
console.log(window.b); //undefined
const c=2
console.log(window.c); //undefined
2. var存在变量提升,let const没有
console.log(a); //undefined
var a=123
console.log(b);
let b=1
//未捕获的ReferenceError:无法在初始化之前访问词法声明'b'
console.log(c);
const c=2
//未捕获的ReferenceError:无法在初始化之前访问词法声明'c'
3. var可以重复声明,let const如声明会报错
var a=123
var a=100
console.log(100)
let b=22
let b=111
//未捕获的SyntaxError:标识符'b'已经被声明
let b=22
let b=111
//未捕获的SyntaxError:标识符'c'已经被声明
4. let const生成块级作用域
if(true){
var a=10
let b=20
}
console.log(a) //10
console.log(b) //Uncaught ReferenceError: b is not defined
5. let const存在暂时性死区
var a=10
function fn(){
console.log(a)
let a=20
}
fn() //暂时性死区
6. const
- const声明必须赋值,否则会报错
- const声明赋值后不能修改
- 如果是复合数据类型,可以修改其属性
const arr=[]
arr=[1,2,3] //报错,改变了内存指针的指向
arr.push(2) //[2]
const obj={}
obj={aa:123} //报错
obj.name='小亮' //{name:'小亮'}指针未改变,只修改其属性不报错
说一下js事件代理是什么
js事件代理就是给父级元素绑定事件,不用给子级元素绑定事件,子集元素通过事件冒泡机制触发,绑定的事件,不用给每一个子元素添加事件,通过event的target属性实现。
<ul id="uls">
<li>你好</li>
<li>hello</li>
<li>代码</li>
<li>爱迪生</li>
</ul>
let uls=document.querySelector('#uls')
uls.addEventListener('click',function(e){
console.log(e.target.innerHTML);
})
jq 方式实现相对而言简单 $(“ul”).on(“click”,“li”,function(){//事件逻辑}) 其中第二个参数指的是触发事件的具体目标,特别是给动态添加的元素绑定事件,这个特别起作用
闭包
优点:可以隔离作用域,不造成全局污染。
缺点:由于闭包长期驻留内存,则会导致内存无法被释放。
如何释放内存:将暴露外部的闭包变量置为 null。
let obj={
name:'哈维',
fun:function(){
return this.name
}
}
obj.fun()
obj=null
js垃圾回收机制
Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。
标记清除
标记清除是通过变量进入环境(即在执行预编译的时候将变量放入到作用域中)时对变量进行标记(标记为进入进入),当变量离开环境时又会被标记为离开环境。当垃圾回收时会将内存中的所有变量标记为可回收,然后再将环境中的变量和被环境中变量引用的变量的标记清除,然后对被标记的变量进行销毁和回收。
引用计数
引用计数回收机制是通过对一个值的引用次数进行统计,当这个值被付给一个变量时会给这个值标记为引用一次,如果这个值在被付给另外一个变量,则会给这个变量标记为引用两次。当这个值的引用次数为0时,下次垃圾回收时会把这个值进行回收。但是引用计数垃圾回收机制有个问题,就是循环引用,导致垃圾不能被回收。
function problem () {
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
problem();