讲讲javascript中的闭包

讲讲javascript中的闭包

很多人以为 javascript 中的闭包就是 一个IIEF 或者一个 外部变量引用 某一个函数的内部函数 这2种形式

其实这是不对的。。闭包指的不是某一种形式 而指的是某种作用域的引用

// 大部分人所认为的js的闭包 其实这只是个立刻执行的匿名函数表达式 IIEF
(function(){
    console.log('hello');
})();

// 或者这种形式
function foo(){
    var a = 2;

    function bar(){
        console.log(a);
    }

    return bar;
}

var baz;

baz = foo();

baz();

而闭包指的是某一种对一定范围的内的词法作用域的引用
例如:

function foo(){
    var a = 2;
    function bar(){
        console.log(a);
    }

    return bar;
}

var baz;

baz = foo(); // baz保持着bar对foo的词法作用域的引用

baz(); 

下面这种也叫闭包

function foo(){
    var a = 2;
    function bar(){
        console.log(a);
    }

    baz = bar; // 这里bar 赋值给了外部的baz 
}

var baz;

foo(); // 执行之后 baz 拥有了和bar同样的对foo的词法作用域的引用

baz(); 

或者这种

function baz(func){
    func(); // 这里执行bar
}

function foo(){
    var a = 2;
    function bar(){
        console.log(a);
    }

    baz(bar); // 这里bar 作为参数赋值给力bar
}

foo(); // 执行之后 baz 拥有了和bar同样的对foo的词法作用域的引用

baz(); 

通过上面3个例子大家就应该明白了 javascript里闭包的概念了

闭包指的不是某一种形式 而指的是某种作用域的引用
同时因为一直保持着对某一个词法作用域的引用 所以被引用的函数是一直无法被GC回收的 所以要慎用闭包

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值