闭包是对作用域范围的扩展,闭包让函数可以在外部访问该函数被创建的作用域内的变量。
一般来说,一个函数的内部变量是无法在外部获取到的,但是我们可以在这个函数内创建一个内部函数来获取这个外部函数内的局部变量。另外闭包对变量的引用是内存地址的引用。因此闭包主要有两大用处:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
闭包同样也适用于循环中的函数,函数能够看到变量值的变化,即使在函数定义以后。因此循环中的每个函数都将引用变量中存储的最后一个值。
// 每一次循环执行方法都会引用 // 变量i中存储的最后一个值(5) // 这与我们想的不同,原因是,函数被延迟执行,而变量i的值已经改变了 for ( var i = 0; i < 5; i++ ) { setTimeout(function() { alert( i ); }, i * 100 ); } |
闭包也可以解决this关键字作用域的问题。
// 使用闭包同时访问内部和外部的对象实例 var outerObj = { myName: "outer", outerFunction: function() { var self = this; var innerObj = { myName: "inner", innerFunction: function() { console.log( self.myName, this.myName ); // "outer inner" } }; innerObj.innerFunction(); console.log( this.myName ); // "outer" } }; outerObj.outerFunction(); |