JavaScript高级程序设计: 函数表达式
闭包
闭包是指有权访问另一个函数函数作用域中的变量(内部变量)的函数.
function createComparsionFunction( propertyName ){ return function( object1 , object2 ){ var value1 = object1[ propertyName ]; var value2 = object2[ propertyName ]; if( value1 < value2 ){ return -1; } else if( value > value2 ){ return 1; } else{ return 0; } }; } var compare = createComparsionFunction('age'); compare( {age: 15} , {age: 17} ); // -1
闭包与变量
闭包只能取得包含函数中任何变量的最后一个值,闭包包含的是整个变量对象,而不是某个特殊变量。
function createComparsionFunction(){ var results = new Array(); for( var i=0; i<10; i++ ){ results[i] = function(){ return i; } } return results; } results = createComparsionFunction(); results[0](); //10 results[1](); //10
但是,我们可以通过创建另一个匿名函数强制让闭包的行为符合预期。 这里的匿名函数有一个参数num,由于参数是按值传递,所以就会将变量i的值复制给num, 而匿名函数内部定义的闭包正好取到num值并返回。
function createComparsionFunction(){ var results = new Array(); for( var i=0; i<10; i++ ){ results[i] = function(num){ return function(){ return num; } }(i); } return results; } results = createComparsionFunction();
模块模式
var singleton = function(){ var privateVar = 10; // 私有变量和私有函数 function privateFunc(){ return false; } // 特权/公有方法和属性 return { publicProperty: true, publicMethod: function(){ privateVar = privateVar + 1; return privateVar; } }; }; var1 = singleton(); var1.publicMethod(); // 11