js中的闭包

js中的闭包几乎是面试中必被问及的问题,接下来就谈谈本人对闭包的一些理解。

首先得说说作用域的问题,大家都知道函数内部声明的变量具有函数内作用域,属于局部变量,只能在该函数内访问它,函数外是不可见的。那我们怎么才能访问到函数内部的局部变量呢?通过闭包我们就可以间接做到这一点。举个例子:

function f2() {
  var b = 5;
  function f1() {
    return b;
  }
  return f1;
}
var c = f2();
console.log(c());

在上面的例子里面,变量b被定义在函数f2内部,它属于局部变量,我们在函数f2外部也即全局作用域内是无法访问变量b的。在函数f2内部我们又定义了一个函数f1,在函数f1内部是可以访问到变量b的。在函数f2的最后 ,return f1这条语句则返回了函数f1自身来作为执行函数f2的结果(注意只是返回函数f1自身,在函数f2里并未执行函数f1)。var c = f2()这条语句则执行函数f2,并将执行结果存于变量c中,函数f2执行的结果就是函数f1本身,则变量c即可引用函数f1。所以最后一条语句输出结果为5,即局部变量b的值,这样就完成了在函数外部访问函数内部局部变量的要求。那什么是闭包?本人认为在一个父函数内先声明局部变量,然后在父函数内定义的子函数内部引用了该局部变量,最后在父函数外存在对子函数的引用,具备这三要素即构成了闭包。闭包可以让函数内部的局部变量当全局变量用,同时又避免了变量污染的问题,请看下面的例子:

var b = 1;
function f2() {
  var b = 5;
  function f1() {
    return b;
  }
  return f1;
}
var c = f2();
console.log(c());//输出5
console.log(b);//输出1

在函数f1执行结束后,并不会改变全局变量b的值,最后输出全局变量b的值仍为1。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值