JS:js闭包,通俗易懂(*****五颗星)
1.闭包的基本概念(语法)
闭包的概念:
闭包的本质:当前环境中存在指向父级作用域的引用(存在即可),为了设计私有的方法和变量。
闭包就是能够读取其他函数内部变量的函数或指那些能够访问另一函数作用域中的变量的函数,或者子函数在外调用,子函数所在的父函数的作用域不会被释放。(每个子函数都会拷贝上级的作用域)
红宝书对闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数
MDN对闭包的定义为:闭包是指那些能够访问自由变量的函数。(自由变量:指函数中使用的但既不是函数参数arguments也不是函数的局部变量,其实就是另一函数作用域中的变量)
闭包的优点:可以避免全局变量的污染,
闭包的缺点:闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才能产生作用域的概念。闭包有三个特性:函数嵌套函数;函数内部可以引用外部的参数和变量;参数和变量不会被垃圾回收机制回收。
简单来说如下:
函数中返回一个函数的结构------闭包
返回一个函数-------返回的是一个执行环境----返回的是变量本身
<script> function fn(){ var a=10 } fn() console.log(a)//报错,a未定义,因为局部变量不能在外部使用 </script>
<script> //需求: 将局部变量拿到外部访问 function fn(){ var a=10 return a//直接返回变量a-----返回的是值(10),不是变量a } var a=fn() console.log(a)//10 </script>
<script> // 函数中返回一个函数的结构------闭包 // 函数fn调用完的时候,局部变量a还没有被销毁,并且永远不会被销毁 function fn(){ // 返回一个函数-------返回的是一个执行环境----返回的是变量本身 var a = 10; return function(){//函数没有运行的时候,里面的变量是不能被销毁的,并且永远都不会被销毁 return a;//直接返回变量a----返回的是变量a本身 } } var a = fn(); console.log(a()); </script>
2.闭包的特点:
1. 防止全局变量的污染
2. 保护了(局部)私有变量的安全,不会被修改
3. 让函数外部访问局部变量成为可能,打破了作用域的限制,延迟
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理