如何理解JS中的闭包及其优缺点

本文详细解析了JavaScript中闭包的概念,包括如何通过闭包访问函数内的局部变量,闭包的优缺点,以及如何利用闭包实现变量的私有化。通过实例展示了闭包在实际编程中的应用。

答案:

简单理解就是函数中嵌套函数。我们都知道局部变量我们是无法访问的,但是通过闭包可以做到。

// 正常访问
var lan = 'zh';
function hello(){
  var name = '前端';
}
console.log(name) //很明显'undefined'

// 换成闭包
function hello(){
    var name = '前端';
    function demo(){
      console.log(name) //打印:前端
    }
}

 

详细解析:

Javascript 在函数外部自然无法读取函数内的局部变量。

function f1() {
    var n=999;
}

alert(n); // error

需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上声明了一个全局变量!

 

闭包:指有权访问另一个函数作用域中的变量的函数。

理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。

在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

 

闭包的优缺点

优点(闭包的作用):

  • ① 在函数执行完后,函数内部的变量一直存在于内存中,不会在调用结束后被垃圾回收机制回收;

  • ② 函数外部也可以读取到函数内部的变量;

缺点:

由于闭包会使用函数中的变量存在在内存中,内存消耗很大,所以不能滥用闭包

解决的办法是:退出函数之前,将不使用的局部变量删除

 

闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」,实现私有化。依据软件设计中的最小特权原则,应该最小限度的暴露必要内容,而将其他内容都隐藏起来。在编写面向对象的JS代码中,是无法使用传统的私有变量的,即无法让对象的属性保持对外隐藏。但是通过使用闭包就可以创建私有变量。

在这个例子中,不能直接访问私有变量counter,只能通过存取的方式获取私有变量的值。

function MyConstructor(){
    var counter = 0;
    this.getCounter = function(){
        return counter;
    }
    this.addCounter = function(){
        counter++;
    }
}

var myConstructor = new MyConstructor();
myConstructor.addCounter();
console.log(myConstructor.getCounter()); //1
console.log(myConstructor.counter);      //underfined

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值