面试之闭包与作用域

闭包

由于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值