JavaScript的閉包
阿新 • • 發佈:2018-05-03
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的閉包