函数体内部的变量都可以保存在函数作用域内。 -----闭包(函数变量可以被隐藏于作用域链之内,因此看起来是函数将变量“包裹”了起来)
当一个函数嵌套另外一个函数,外部函数将嵌套的对象作为返回值返回。往往就时闭包了。理解闭包首先了解嵌套函数的词法作用域规则。
var scope = 'global scope'; function checkscope(){ var scope = 'local scope'; function f(){return scope}; return f; } checkscope()() //"local scope"
特性:可以捕捉到局部变量(和参数),并一直保存下来,看起来像这些变量绑定到了在其中定义它们的外部函数。
var unique = (function(){ var conter = 0; return function(){return conter++} }()); unique()
利用闭包实现私有属性存取器方法(私有状态共享的通用做法):
function addPrivateProperty(o,name,predicate){ var value; o[`get${name}`] = function(){return value;}; o[`set${name}`] = function(v){ if(predicate && !predicate(v)) throw Error(`set ${name}:invalid value ${v}`) else value = v; } } var o = {}; addPrivateProperty(o,'Name',function(x){return typeof x == "string"}); o.setName("Frank"); console.log(o.getName());
在同一个作用域链中定义两个闭包,这个两个闭包共享同样的私有变量或者变量,这是一种非常重要的技术。
重要点:闭包内无法直接访问外部函数的参数数组,除非外部函数将参数数组保存在另外一个变量中:
var outerArguments = arguments;
var that = this;