<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>js-熟练掌握闭包</title>
</head>
<body>
<script>
?
/*******第一点(允许引用当前函数以外定义的变量)**************/
function outer2() {
? ?var str = "I am Out..";
? ?function inner(inStr) {
? ? ? ?alert(str + " -- " + inStr); // 可以引用到函数外的str
? ?}
? ?return inner("I am inner..");
}
outer2();
?
/*******第二点(即使外部函数已经返回,但是闭包依然可以引用外部函数定义的变量)**************/
function outer() {
? ?var str = "I am Out.";
? ?function inner(inStr) {
? ? ? ?alert(str + " -- " + inStr);
? ?}
? ?return inner; // 返回后,依然可以引用到 str.
}
outer()("I am inner1.");
outer()("I am inner2.");
?
/*******第三点(闭包存储的是外部变量的引用,而非值的副本)**************/
function wrapEle(ary) {
? ?var ret = [], i, n;
? ?for(i = 0; i < ary.length; i++) {
? ? ? ?ret[i] = function() {
? ? ? ? ? ?return ary[i];
? ? ? ?};
? ?}
? ?alert("i: " + i); // 3
? ?return ret;
}
var wrapped = wrapEle([1, 2, 3]);
var value = wrapped[0](); // 实际上执行的是 function() {return ary[3]};
?// 存储的是外部变量i的引用,外部方法执行完成后,i = 3;
alert(value); // undefined
?
</script>
?
<p>
?
★★★关于闭包必须知道的是★★★:
1. 允许引用当前函数以外定义的变量
2. 即使外部函数已经返回,当前函数(闭包)依然可以引用外部函数定义的变量
3. 闭包可以更新外部变量的值,实际上,闭包存储是外部变量的引用,而不是外部变量值的副本
</p>
</body>
</html>
原文:http://mumu-shoucang.iteye.com/blog/2279529