对javascript闭包的基本理解

闭包是javascript中的一个重要概念,有关闭包的问题经常出现在各大网站总结的面试题上,在日常开发中,我们也会不经意的使用闭包而不自知,今天就来讲一讲闭包


一些经典的javascript书籍上大多对于闭包有了明确的定义,《javascript高级程序设计》上是这样写的:

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

在《你不知道的javascript》中是这样的:

当函数可以记住并访问所在的词法作用域时,就产生的闭包,即使函数是在当前词法作用域之外执行。

注意这两个定义都提到的作用域,所以对闭包的理解要从javascript的作用域开始。其实javascript的作用域就是由你再写代码时将变量和块作用域写在哪里决定的,javascript引擎在查找变量的时候会由内而外逐级查找,比如像这样:

function f(a){
var b=a;
 function t(){
    console.log(b);
    }
}
f(2);//2

如果我们想在代码中展示闭包,那么应该是这样:

function f()
{
    var a =2;
    function bar(){
    console.log(a);
    }
    return bar;
}
   
}
var bz=f();
bz(); //2


bar()被定义在f()中,却在f()之外执行,按道理来说应该取不到a的值,因为此时按照作用域的查找方式是找不到变量a的,但实际上bz()可以执行成功,这就是闭包的作用。也就是说当我们将函数bar作为一个值去传递的时候,它可以一直保持一个对其本身定义位置的作用域的引用。无论我们用什么方式,直接或者间接的传递这个函数,比如你可以这样:

var fn;
function f()
{
    var a =2;
    function bar(){
    console.log(a);
    }
    fn = bar;
}
    function bz(){
    fn();
}
bz(); //2
综上,闭包可以总结为两句话:将一个函数通过各种方式传递到它的作用域外执行,就会产生闭包。

而闭包的作用就是让这些函数仍然能够引用它原有的作用域。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值