深拷贝和浅拷贝的区别
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
声明提升的本质
因为js引擎在编译处理声明的优先级高于其他逻辑代码 包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理
怎样理解作用域
负责收集并维护由所有声明的标识符(变量,函数,对象)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。简单来说,作用域就是变量访问规则的有效范围。
什么是闭包 闭包的好处和缺点
闭包就是拥有访问另一函数的函数作用域权限的函数。闭包函数能记录并访问所在的词法作用域。即使函数是在当前词法作用域之外执行。
闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数
new关键字做了哪些事
new操作符将函数作为构造器进行调用时的过程:函数被调用,然后新创建一个对象,并且成了函数的上下文(也就是此时函数内部的this是指向该新创建的对象,这意味着我们可以在构造器函数内部通过this参数初始化值),最后返回该新对象的引用。
call、apply与bind有什么区别?
1.call、apply与bind都用于改变this绑定,但call、apply在改变this指向的同时还会执行函数,而bind在改变this后是返回一个全新的boundFcuntion绑定函数,这也是为什么上方例子中bind后还加了一对括号 ()的原因。
2.bind属于硬绑定,返回的 boundFunction 的 this 指向无法再次通过bind、apply或 call 修改;call与apply的绑定只适用当前调用,调用完就没了,下次要用还得再次绑。
3.call与apply功能完全相同,唯一不同的是call方法传递函数调用形参是以散列形式,而apply方法的形参是一个数组。在传参的情况下,call的性能要高于apply,因为apply在执行时还要多一步解析数组。