關於閉包的理解

閉包官方定義:閉包是指程序中有許多變量和綁定變量的執行環境。閉包

本人本身理解:程序的代碼段容許存在一級函數而且一級函數不能被釋放,一級函數沒有釋放以前,外部能夠使用一級函數的局部變量。函數

進一步理解 : 閉包就是外部能夠使用局部變量。spa

閉包的功能:一、外部能夠使用局部變量。
      二、使函數不能釋放。
閉包的缺點:外部會修改局部變量,會大量佔用內存,內存不會被釋放。code

爲何一級函數不能被釋放?
答:由於一級函數中有一個函數,這個函數使用了一級函數的變量,咱們返回了這個函數並建立一個變量接收了。那麼這個函數就不會被js的垃圾回收機制銷燬。blog

最經常使用的一種形式是函數做爲返回值被返回內存

var F = function(){
    var b = 'local';
    var N = function(){
        return b;
    }
    return N;
}
console.log(F()());

一種變形的形式是將內部函數賦值給一個外部變量get

var inner;
var F = function(){
    var b = 'local';
    var N = function(){
        return b;
    };
    inner = N;
};
F();
console.log(inner());

閉包能夠經過函數參數傳遞函數的形式來實現io

var Inner = function(fn){
    console.log(fn());
}
var F = function(){
    var b = 'local';
    var N = function(){
        return b;
    }
    Inner(N);
}
F();

咱們經過提供getter()和setter()函數來將要操做的變量保存在函數內部,防止其暴露在外部console

var getValue,setValue;
(function(){
    var secret = 0;
    getValue = function(){
        return secret;
    }
    setValue = function(v){
        if(typeof v === 'number'){
            secret = v;
        }
    }
})();
console.log(getValue());//0
setValue(1);
console.log(getValue());//1

使用閉包能夠很方便的實現一個迭代器function

function setup(x){
    var i = 0;
    return function(){
        return x[i++];
    }
}
var next = setup(['a','b','c']);
console.log(next());//'a'
console.log(next());//'b'
console.log(next());//'c'

謝謝你們

相關文章
相關標籤/搜索