恍然大悟之JS闭包快速理解

快速理解JS闭包

闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
由上可知,闭包需要满足三个条件:【1】访问所在作用域;【2】函数嵌套;【3】在所在作用域外被调用
在函数F内用var定义的变量是该函数的局部变量,外部不能直接访问(除非new一个该函数的实例),但该函数F内部的函数f通过作用域链可以访问函数F的局部变量,那么只要把f作为返回值,我们不就可以在F外部读取它的内部变量了吗!

function f1(){

    var n=999;

    function f2(){
      alert(n); 
    }

    return f2;

  }

  var result=f1();

result(); // 999

前面说到可以将函数f返回出去,那么如何“返回”就有很多种形式,因此闭包大概有这么几种方式:1、作为函数F的返回值返回,如:

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

2、在F内部将其赋值给外部变量,如:

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

3、在F内部将其以参数形式传给外部函数,如:

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

闭包还有很多应用方式:如充当getter setter、实现一个累加器、迭代器、区分首次、缓存机制等,具体可看 https://www.xiaohuochai.cc/posts/5afaa9f0002834409838bd3f

你可能感兴趣的:(恍然大悟之JS闭包快速理解)