闭包
由于JS中变量的作用域属于函数作用域,在函数执行后作用域就会被清理,内存也随之销毁。
而闭包时建立在函数内部的子函数,由于它对上级作用域具有 可访达性。因此在上级函数自行完毕后,这个函数内的作用域还存在引用,因此无法销毁。
实际上,闭包其实就是缓存作用域,使函数外部打破函数作用域的约束。可以访问函数内部的变量。同样,他的副作用就是销毁内存。
使用场景:
ajax中的回调函数,setTimeout中的匿名函数。或者一个函数返回函数,其实也是闭包。
作用域
作用域分全局作用域、函数作用域,块级作用域。如果把代码看成一个IIFE时,则全局作用域其实就是一个函数作用域。函数作用域中,变量在定义函数内及嵌套子函数内处处可见;
在函数内部,使用var定义的变量则提升到赋值和使用之前。函数声明也会提前。
块级作用域
变量在离开定义的块级代码后马上被回收、
块级作用域:
catch块捕获的异常只在catch块中可见。
let定义的变量遵循块级作用域,变量在定义是不会提升到这个函数内的作用域
const定义变量和let一样,不会提升变量。与let不同的是,const变量,不能赋值,赋值则会抛出ReferenceError
作用
1. 允许块级作用域任意嵌套
2. 外层作用域无法读取内存作用域的同名变量
3. 内存作用域可以定义外层作用域的同名比那辆
4. 函数本身的作用域在其所在块级作用域之内
5. 在没有引入块级作用域时,往往使用立即执行函数IIFE。
在ES6以前变量的作用域时函数范围,有时在函数内局部需要一些临时变量,因为没有块级作用域,所以
就会将局部变量封装到IIEF中。这样达到了想要引入又不增加多余的临时变量。避免了临时变量污染了上层函数。
现在新增块级作用域之后,直接放入块级作用域就可达到同样效果。
原型
所有的数据都是对象,要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它,对象会记住它的原型。如果对象无法响应某个请求,它会把这个请求委托给它自己的原型
https://www.cnblogs.com/moumoon/p/10985250.html