1. 匿名函数
alert((function() {return "Lee";})()); //使用()匿名函数直接调用
(function(age) {
return age;
})(100);
function box() {
return function() {
return "Lee";
}
}
2. 闭包
function box () {
var age = 100;
return function () {
return age;
}
}
alert(box()()); //通过闭包访问局部变量。局部变量驻留在内存中。
3. 循环里的匿名函数的取值问题
function box() {
var arr = [];
for (var i=0; i<5; i++) {
arr[i] = function() {
return i; //匿名函数中的i都会是5, 通过匿名函数自我及时执行解决这个问题。
}
}
return arr;
}
function box() {
var arr = [];
for (var i=0; i<5; i++) {
arr[i] = (function(number) {
return number; 通过匿名函数及时自我执行解决这个问题。
})(i);
}
return arr;
}
function box() {
var arr = [];
for (var i=0; i<5; i++) {
arr[i] = (function(number) {
return function() {return number};
})(i);
}
return arr;
}
4. 闭包中使用this对象
闭包中的this对象指向window
var box = {
getThis: function () {
return function() {return this;} //这里的this指向window
}
}
var box = {
getThis: function () {
var that = this;
return function() {return that;} //先把this作用域保存给that变量,再使用that操作box作用域下的变量。
}
}
5. 内存泄漏
闭包应该避免内存泄漏
6. 模仿块级作用域
javascript没有块级作用域, if else, for不会产生块作用域
function box() {
(function () {
for (var i=0, i<5; i++){
}
})();
}
(function() {
var a,b,c; //防止变量名字冲突
})();
7. 私有变量
function Box(){
var age = 100;
var run = function () {
return age;
}
this.publicRun = function () { //私有变量无法访问,定义个公共接口访问
return age + run();
}
}
8. 模块模式
var box = function() {
var user = "Lee";
function run () {
return '"running..";
}
return {
publiGo: function () {
return user + run();
}
}
}
9. 增强的模块模式
function Desk() {
}
var box = function() {
var user = "Lee";
function run () {
return '"running..";
}
var desk = new Desk();
desk.publicGo = function () {
return user + run();
}
}