[前端]什么是闭包?

2022-10-14  本文已影响0人  半颗糖嘿

1)什么是闭包?
当一个函数里面返回另一个函数的形式,就称为闭包。
eg:

function fn() {
  var a = 1;
  return function() {
    return a;
  }
}
var b = fn();
console.log(b());// 1

2)闭包的作用:打破函数作用域的限制,当前函数的作用域外访问函数内部的私有成员,延长变量的声明周期。
3)特点:
①打破了作用域的限制,让全局访问局部变量成为可能。
②局部变量常驻内存中------》内存空间长期被占用(弊端),会造成内存泄漏(有一块内存空间被长期占用,而不被释放)。
③归根结底还是局部变量------》防止了全局变量的污染。
4)应用场景
场景一:模块封装,防止变量污染全局

var Mokuai = (function(){
    // 声明为模块私有变量,外界无法直接访问
    var foo = 0;
    function Mokuai(){}
    Mokuai.prototype.bar = function bar(){
        return foo;
    }
    return Mokuai;
}());

场景二::在循环中创建闭包,防止取到意外的值

eg:无论哪个元素触发事件,都会弹出5。因为函数执行后引用的i是同一个,而i在循环结束后就是5。
for(var i = 0;i<5;i++){
    document.getElementById('id'+i).onfocus = function(){
        alert(i);
    }
}
// 可用闭包解决
function makeCallback(num){
    return function(){
        alert(num);
    }
}
for(var i = 0;i<5;i++){
    document.getElementById('id'+i).onfocus = makeCallback(i);
}
上一篇下一篇

猜你喜欢

热点阅读