闭包是什么?特点是什么?
闭包是指有权利访问另一个函数作用域中变量的函数;
- 是一个函数
- 能访问另外一个函数作用域中的变量
function fn() { var a = 20 return function () { console.log(a) } }
让这个局部变量a像全局变量一样,不被垃圾回收机制所回收,一直在内存中,( js垃圾回收机制也就是当一个函数被执行完后,其作用域会被回收。如果形成闭包,执行完后其作用域就不会被回收。) 如果某个函数被他的父函数之外的一个变量应用,就会形成闭包。这是形式中的闭包(表面的理解).
一、特点:
- 闭包可以访问当前函数以外的变量;
- 即使外部函数已经返回,闭包仍能访问外部函数定义的变量。
- 闭包可以更新外部变量的值。
典型闭包写法:
// 第一种 function fn1() { var num = 100 function fn2 () { console.log( str + num ) // 访问外部的num } return fn2(' 数字是: ') } fn1() // 第二种 function fn1() { var num = 100 function fn2 (str) { console.log( str + num ) // 访问外部的num } return fn2 // 外部函数返回值 } var res = fn1() res('数字是:') res('数字不是:') // 第三种 function fn1() { var count = 100 function fn2 (val) { count = val console.log( count ) } return fn2 // 外部函数返回值 } var count = fn1() count(111) count(222)
二、基础知识铺垫:
要想看懂闭包,必须要有以下基本功作为铺垫;
研究闭包这个现象的资格要具备以下几点:
- 高阶函数
- 函数作用域;
- 作用域链;
- 找原型链;
- js解释器的事;
- 浏览器的编译原理。