1、let和var的区别
- let不存在变量提升
- let不允许重复声明
- let在全局下声明的变量只是全局变量,和全局对象GO没有任何关系;而var在全局下声明的的全局变量,也相当于给全局对象GO设置了对应的属性,而且存在映射关系
- let解决了typeof检测没有声明过的变量的时候,结果是undefined而不是报错的暂时性死区问题
- let会产生一个块级私有作用域
2、什么是闭包,闭包的作用以及优缺点
- 闭包:函数执行形成的私有上下文,即能保护里面的私有变量不受外界干扰,也能在当前上下文中储存一些信息(前提:形成的上下文不销毁),上下文的这种保存和保护机制,就是闭包机制。
- 作用:
- 1、保存 :在某些需求中,我们经常需要形成一个闭包,储存一些值(且不能销毁),这样来供后面的程序运行使用(例如:惰性函数、柯理化函数、compose函数等JS高阶编程技巧中,就是基于闭包的保存机制实现的)
- 2、保护:在真实项目中,团队协作开发(或者封装公共的组件和类库),为了避免全局变量的污染,我们每个人都会把自己的代码放到闭包中保护起来
- 优点即作用
- 缺点:因为闭包会产生不销毁的上下文,这样导致栈/堆内存消耗过大,有时候也会导致内存泄漏等,影响页面的运行性能,真实项目中要合理利用闭包。
3、自执行函数具名化
- 一般情况下,自执行函数都是匿名函数,但是当给其设置成为具名函数以后:
- 设置的函数名只能在函数的内部上下文中使用(和外界变量没有联系),相当于当前私有上下文中的一个私有的变量(类似但是不是私有变量)
- 不能修改这个函数名
- 可以重新声明这个变量的方法修改它的值(相当于我们自己主动声明的优先级会很高,告诉浏览器,以我们自己声明的为主)
- 具体的说明可以参考这里的一些信息。
4、THIS
EC(执行上下文):当前代码执行的环境
- 全局执行上下文
- 私有执行上下文(函数执行)
- 块级作用域(let/const…)
this:执行主体(谁把这个函数执行的)
三四而后行:函数的执行主体是谁,和在哪定义的,以及在哪执行的都没有必然的联系 “你以为你以为的就是你以为的”
THIS:执行主体是对象数据类型的(特殊情况:null/undefined)
- 1.给元素的某个事件行为绑定方法,当行为触发,方法执行的时候,方法中的THIS “一般” 都是当前元素本身
// IE6~8低版本浏览器中,基于attachEvent实现DOM2事件绑定,事件触发,方法执行,方法中的THIS不是元素本身了,而是window
box.attachEvent('onclick', function () {
console.log(this === window); //=>true
});
- 2.方法执行,看方法前面是否有“点”,有“点”,“点”前面是谁,THIS就是谁;没有“点”,THIS一般指向的是window/undefined,在严格模式(use strict)下就是undefined。