1 <script type="text/javascript">
2 //什么是闭包:
3 //是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。
4 //这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)。
5 //简单来说,闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),
6 //而这些键值对是不会随上一级函数的执行完成而销毁。
7 //周爱民说得更清楚,
8 // 闭包就是“属性表”,
9 // 闭包就是一个数据块,
10 // 闭包就是一个存放着“Name=Value”的对照表。
11 // 就这么简单。但是,必须强调,闭包是一个运行期概念。
12
13
14 with (obj) {
15 //这里是对象闭包
16 }
17 (function () {
18 //函数闭包
19 })()
20 try {
21 //...
22 } catch (e) {
23 //catch闭包 但IE里不行
24 }
25
26 function User(properties) {
27 var _self = this;
28 for (var i in properties) {
29 (function () {
30 //在闭包内,t每次都是新的,而properties[i]是for里面的
31 var t = properties[i];
32 _self["get" + i.toLocaleLowerCase()] = function () {
33 return t;
34 }
35 _self["set" + i.toLocaleLowerCase()] = function (val) {
36 t = val;
37 }
38 })();
39 }
40 }
41
42 var a = (function (n) {
43 debugger;
44 if (n < 1) {
45 alert("invalid arguments");
46 return 0;
47 }
48 if (n == 1) {
49 return 1;
50 }
51 else {
52 return (n * arguments.callee(n - 1));
53 }
54 })(4);
55
56 document.writeln(a);
57
58 var user1 = new User({
59 name: "张三",
60 age: 22
61 });
62
63 alert(user1.getname());
64 alert(user1.getage());
65
66 user1.setname("李四");
67 user1.setage(25);
68
69 alert(user1.getname());
70 alert(user1.getage());
71 </script>
其中经典闭包函数:
var fun=function(e){
console.log("步骤1:"+e)
fun=function(){
console.log("步骤2:"+e)
return e;
}
return fun();
}
<input type="button" οnclick="alert(fun(1))" value="按钮1"/>
<input type="button" οnclick="alert(fun(2))" value="按钮2"/>
<input type="button" οnclick="alert(fun(3))" value="按钮3"/>