1. 递归
sayHi(); function sayHi(){ alert("Hi!");}sayHi(); //错误:函数还不存在 var sayHi = function(){ alert("Hi!");};//不要这样做! if(condition){ function sayHi(){ alert("Hi!"); }} else { function sayHi(){ alert("Yo!"); }}//可以这样做var sayHi;if(condition){ sayHi = function(){ alert("Hi!"); };} else { sayHi = function(){ alert("Yo!"); };}function factorial(num){ if (num <= 1){ return 1; } else { return num * factorial(num-1); }}var anotherFactorial = factorial;factorial = null;alert(anotherFactorial(4)); //出错!function factorial(num){ if (num <= 1){ return 1; } else { return num * arguments.callee(num-1); }}var factorial = (function f(num){ if (num <= 1){ return 1; } else { return num * f(num-1); }});
2. 闭包
2.1 闭包与变量
2.2 关于 this 对象
2.3 内存泄漏
3. 模仿块级作用域
(function(){ //这里是块级作用域})();function outputNumbers(count){ (function () { for (var i=0; i < count; i++){ alert(i); } })(); alert(i); //导致一个错误!}(function(){ var now = new Date(); if (now.getMonth() == 0 && now.getDate() == 1){ alert("Happy new year!"); }})();
- 这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。 只要函数执行完毕,就可以立即销毁其作用域链了。
4. 私有变量
//特权方法function Person(name){ this.getName = function(){ return name; }; this.setName = function (value) { name = value; };}var person = new Person("Nicholas");alert(person.getName()); //"Nicholas"person.setName("Greg");alert(person.getName()); //"Greg"
4.1 静态私有变量
(function(){ var name = ""; Person = function(value){ name = value; }; Person.prototype.getName = function(){ return name; }; Person.prototype.setName = function (value){ name = value; };})();var person1 = new Person("Nicholas");alert(person1.getName()); //"Nicholas"person1.setName("Greg");alert(person1.getName()); //"Greg"var person2 = new Person("Michael");alert(person1.getName()); //"Michael"alert(person2.getName()); //"Michael"
4.2 模块模式
var application = function(){ //私有变量和函数 var components = new Array(); //初始化 components.push(new BaseComponent()); //公共 return { getComponentCount : function(){ return components.length; }, registerComponent : function(component){ if (typeof component == "object"){ components.push(component); } } };}();
4.3 增强的模块模式
var application = function(){ //私有变量和函数 var components = new Array(); //初始化 components.push(new BaseComponent()); //创建 application 的一个局部副本 var app = new BaseComponent(); //公共接口 app.getComponentCount = function(){ return components.length; }; app.registerComponent = function(component){ if (typeof component == "object"){ components.push(component); } }; //返回这个副本 return app;}();