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。