闭包
- function outter(){
- var a = 1;
- function inner(){
- console.log(a);
- }
- return inner;
- }
- // 进行函数调用
- var inner = outter();
- inner();
以上代码是最基本的闭包的形成. 当 outter 函数开始调用的时候, 它内部就形成了一个闭包, 这个闭包存在使用了 outter 函数的 a 变量的 inner 函数的作用域中. 所以当 inner 函数调用的时候, 才能够仍然访问到 outter 函数的 a 变量.
所以可以看到闭包的一些特性.
闭包的形成: 当外部函数的执行上下文被启动的时候, 或者说是外部函数被调用的时候
闭包的位置: 闭包存放在内部函数的作用域中, 名称为 closure.
闭包的作用: 能够让内部函数在外依然能够访问到外部函数的变量, 延长了该变量的生命周期.
闭包的形成条件: 函数内里嵌套函数, 并且内函数使用到了外部函数的变量.
闭包的释放: 闭包不会主动销毁, 会造成轻微的内存泄露. 可以自己选择主动的对内部方法进行释放, 置为 null.
那么闭包在 JS 中有何作用, 我觉得闭包很大的作用在于弥补了 JS 语言的一些数据私密性的缺陷.
在 JS 中, 没有类的概念, 一切以函数为尊. 而函数内部的一些属性和方法保证了一些权限, 不可访问. 那么这个时候闭包的作用就显现出来的. 有点相当于其他语言中, 构造了一些私有的属性和方法, 然后提供了一个公开的接口以供访问调用, 然后可以保证一些安全性.
在 JS 中, 通过提供返回的一个函数内部方法, 暴露一些可以公开的变量或者方法让人进行访问.
- function Person(){
- var name = "Jan";
- // 名字可以公开, 但是年纪不能公开
- var age = 18;
- function about(){
- console.log('我的名字是'+this.name);
- }
- return about;
- }
闭包相关面试题
- function fun(n, o) {
- console.log(o)
- return {
- fun: function (m) {
- return fun(m, n)
- }
- }
- }
- var a = fun(0)
- a.fun(1) // -- var b = fun(1,0)
- a.fun(2) // var c = fun(2,0);
- a.fun(3) // var d = fun(3,0)
- // undefined,0,0,0
- var b = fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2
- var c = fun(0).fun(1)
- c.fun(2)
- c.fun(3) //undefined,0,1,1
来源: http://www.bubuko.com/infodetail-2890662.html