1. 程式人生 > >JavaScript的閉包

JavaScript的閉包

nbsp 私有變量 ID urn rop val rank 存取 typeof

函數體內部的變量都可以保存在函數作用域內。 -----閉包(函數變量可以被隱藏於作用域鏈之內,因此看起來是函數將變量“包裹”了起來)

當一個函數嵌套另外一個函數,外部函數將嵌套的對象作為返回值返回。往往就時閉包了。理解閉包首先了解嵌套函數的詞法作用域規則。

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;

JavaScript的閉包