JavaScript 闭包
闭包
是指有权访问另一个函数作用域中的变量的函数(能够读取其他函数内部变量的函数)。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
一个函数的返回值是另一个函数,而返回的这个函数如果调用了其父函数内部的其它变量,且返回的这个函数在外部被执行,就产生了闭包。
表现形式: 函数外部能调用函数内部定义的变量。
1 2 3 4 5 6 7 8 9 10
| function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName; }
var myFunc = makeFunc(); myFunc();
|
注意:
- 滥用闭包会导致内存泄露,处理方法:在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。
闭包的用途
1. 封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| var person = function() { var name = "default"; return { getName : function() { return name; }, setName : function(newName) { name = newName; } } }();
print(person.name); print(person.getName()); person.setName("abruzzi"); print(person.getName());
得到结果如下: undefined default abruzzi
|
2. 实现类和继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function Person() { var name = "default"; return { getName : function() { return name; }, setName : function(newName) { name = newName; } } };
var Jack = function(){}; Jack.prototype = new Person(); Jack.prototype.Say = function() { alert("Hello,my name is Jack"); };
var j = new Jack(); j.setName("Jack"); alert(j.getName()); j.Say();
|
JavaScript 继承
- 构造函数继承
- 原型链式继承
- 组合式继承(借用构造函数和原型链继承两种方式)
- 等等…
参考文档