闭包

闭包

闭包的定义

闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。
js垃圾回收机制:js 中的变量和函数不再使用后,会被自动js垃圾回收机制回收。
形成闭包的条件:有函数/作用域的嵌套;内部函数引用外部函数的变量/参数。

用途

1. 读取函数内部的变量。
2. 让这些变量的值始终保持在内存中。不会在f1调用后被自动清除。
3. 方便调用上下文的局部变量。利于代码封装。
4. 闭包的应用比较典型是定义模块,我们将操作函数暴露给外部,而细节隐藏在模块内部

闭包的表现形式

- 返回一个函数
- 作为函数参数传递
- 回调函数
- 非典型闭包`IIFE`(立即执行函数表达式)
  1. 返回一个函数:这种形式的闭包在JS中非常非常常见。
var a  = 1;
function foo(){
  var a = 2;
  // 这就是闭包
  return function(){
    console.log(a);
  }
}
var bar = foo();
// 输出2,而不是1
bar();
  1. 作为函数参数传递:无论通过何种手段将内部函数传递到它所在词法作用域之外,它都会持有对原始作用域的引用,无论在何处执行这个函数,都会产生闭包。
var a=1;
function foo(){
    var a=2;
    function baz(){
        console.log(a);
    }
    bar(baz);
}
function bar(fn){
    //这就是闭包
    fn();
}
//输出2,而不是1
foo();
function foo(){
    var a = 2;
    function baz(){
        console.log(a);
    }
    bar(baz);
}
function bar(fn){
    var a = 3;
    fn();
}
foo();
//输出2


  1. 回调函数:在定时器、事件监听、Ajax请求、跨窗口通信、Web Workers或者任何异步中,只要使用了回调函数,实际上就是在使用闭包
//定时器
setTimeout(function timeHandler(){
    console.log('timer');
},100)

//事件监听
$('#container').click(function(){
    console.log('DOM Listener');
})
  1. IIFE:IIFE(立即执行函数表达式)并不是一个典型的闭包,但它确实创建了一个闭包
var a = 2;
(function IIFE(){
  // 输出2
  console.log(a);
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值