关于js闭包自己的理解

假设有A函数和B函数,A潜逃了B函数,也就是B函数载A函数的函数体内,那么载A函数定义的变量,B函数是可以看见的,也就是说B函数是可以引用A函数中定义的变量的。反之,则不行,我们用代码来解释一下

function A() {
    var local = "carl";
    function B() {
        return local;
    }
    return B();
}
var global = A();
console.log("name=" + global);

想想这段代码会输出什么呢?
答案是:name=carl;
也就是说,这里,b方法引用了a方法中的变量。
我们再来看看另外一个例子:

function A() {

    function B() {
        var local = "carl";
        return local;
    }
    console.log("local="+local);
    return B();
}
var global = A();
console.log("name=" + global);

看看这段代码的执行结果是什么,结果是报错,为什么?因为在A方法里面引用了local这个B方法中的变量,而这个变量是对A不可见的。
实际上为什么会有这么一个结果,他的本质原因在于js里面的作用域链,在js里面,是没有块这个作用域的,取而代之的是函数作用域。a函数的作用域链有两个元素,一个是a本身,一个是全局作用域。在a和全局作用域都没有发现local的定义,所以就会报错。b的作用域链是这样的,它的第一个元素是它本身,第二个是a函数,第三个是全局作用域,所以,第一段代码是可以正常运行的。
最后,再来看看这个问题

function A() {

    function B() {
        var local = "carl";
        return {
            getLocal : function() {
                return local;
            },
            setLocal : function(value) {
                local = value;
            }
        }
    };
    return B();

}
var local = A();
console.log("name=" + local.getLocal());
local.setLocal("wang");
console.log("name=" + local.getLocal());

如果很清楚这个的结果,就基本掌握了什么是js的闭包了。这篇感想,我也是查阅了很多资料,让后把自己想的写出来,如果有什么不对的,希望博友们指出。
上面的结果是
name=carl
name=wang

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值