重学JavaScript(函数)闭包
序言
学习JavaScript切勿好高骛远。正所谓贪多嚼不烂,前端标准和工具这几年的飞速发展,以及不时冒出的“新鲜玩意”让众多前端从业者惊呼:“学不动啦学不动啦!学习速度跟不上技术发展速度!我感到手忙脚乱、力不从心……"如果你有以上“症状”,请勿着急,这不过是你内心不安造成的。你为何追新?你又何苦追新?在根基不牢的情况下,就算盖楼盖到18层,再往上堆一块砖,都可能导致大楼坍塌!这结果绝非你预期。所以,此时你应该沉下心来苦练基础。而非死钻牛角尖。硬要及时掌握那些业界最新冒出来的“玩意儿”对你无益处。
前言
我们知道,作用域链查找标识符的顺序是从当前作用域开始一级一级往上查找。因此,通过作用域链,JavaScript函数内部可以读取函数外部的变,但反过来,函数的外部通常则无法读取函数内部的变量。在实际应用中,有时需要真正在函数外部访问函数内部的局部变量,此时最常用的方法就是使用闭包。
那么什么是闭包?所谓闭包,就是同时含有对函数对象以及作用域对象引用的对象。闭包主要是用来获取作用域链或原型链上的变量或值。创建闭包最常见的方式是在一个函数中声明内部函数(也称嵌套函数),并返回内部函数。此时在函数外部就可以通过调用函数得到内部函数。虽然按照闭包的概念,所有访问了外部变量的JavaScript函数都是闭包。但我们平常绝大部分时候所谓的闭包其实指的就是内部函数闭包。
闭包可以将一些数据封装私有属性以确保这些变量的安全访问,这个功能给应用带来了极大的好处。需要注意的是,闭包如果使用不当,也会带来一些意想不到的问题。下面就通过几个示例来演示一下闭包的创建、使用和可能存在的问题及其解决方法。
示例1: 创建闭包。
<!DOCTYPE html>
<html>
<head>
<title>闭包</title>
</head>
<body>
<script type="text/javascript">
function outer(argument) {
var b=0;
return function inner (){
b++;
console.log("内部的b:"+b);
}
}
var func = outer();//1 通过外部变量引用函数返回的内部函数
console.log(func);//2 输出内部函数定义代码
func();//3 通过闭包访问局部变量b,此时b=1;
console.log("外部函数中b:"+b); //4 出错,报引用错误。
</script>
</body>
</html>
更多内容请见原文,原文转载自:http://www.mark-to-win.com/tutorial/50902.html