javaScript闭包原理详解

    闭包是 JavaScript 最强大的一个方面,它允许函数访问局部范围之外的数据。

举例1:

    function person () {
        var name = '老王';
        var age = 20;
        return {
            getName: function () {
                return name;
            },
            getAge: function () {
                return age;
            }
        }
    }
    var p1 = person();
    console.log(p1.getName());//'老王'
    console.log(p1.getAge());//20

    上面函数person就是一个闭包的简单实现,可以通过函数getName、getAge访问函数person局部变量name、age。有些人可能会感到奇怪,局部变量在函数执行完成之后不是会释放掉吗?通常,一个函数的激活对象与运行期上下文一同销毁。当涉及闭包时,激活对象就无法销毁了,因为引用仍然存在于闭包的作用域属性中。上面函数person局部变量name,age存在闭包函数getName、getAge对其引用,所以name,age不会立即释放掉。

    经过一个简单的闭包讲解,现在写一个稍微复杂的闭包。

举例2:

 function method () {
        var msg1 = '我是method函数局部变量';
        return function () {
            var msg2 = '我是匿名函数局部变量';
            return {
                msg1:msg1,
                msg2:msg2
            }
        }
    }
    var m = method()();
    console.log('msg1:' + m.msg1,'msg2:' + m.msg2);
    //msg1:我是method函数局部变量 msg2:我是匿名函数局部变量

    上面函数method返回一个匿名函数,匿名函数存在对method局部变量msg1的引用,所以函数method执行完成局部变量msg1不会释放,知道执行完匿名函数msg1才被释放。

    通过上面的闭包原理,我们成功获取到了局部变量msg1。

posted @ 2016-04-20 12:47  minimal虾米  阅读(121)  评论(0编辑  收藏  举报