闭包的理解

一、闭包是什么

查阅了些许文档,个人理解如下:

  闭包是为了读取函数内部变量而发明的。

1.局部变量和全局变量的理解
var y='魔法小樱';
function f1(){
  var x='漩涡鸣人';//这里我们声明了一个局部变量
}
console.log(y);//输出结果是   魔法小樱;
console.log(x);//输出结果是   x is not defined;
//说明了什么问题呢?说明y是全局变量,都可以访问到;x是局部变量,只有f1可以访问到;如果我们想在f1的外面访问到x变量,怎么办呢?这就需要用到闭包的知识了

2.链式作用域
正规解释:子对象会一级一级地向上寻找所有父对象的变量。
通俗理解:你可以想象古时候的王权,在皇宫里,最里面是皇上,外面一层是贵族官员,最外面是老百姓。肯定是里面的皇帝最牛逼啊,想怎么搞就怎么搞,可以获得所有权限和信息。那如果外面的小老百姓想知道皇宫发生了什么事情,怎么办呢?就要通过皇宫里的人来获得信息咯。

3.闭包讲解啦
请看例子:
function f1(){
    var s='你特么打我试试?';
function f2(){ 
console.log(s);
}//我就是一个方法,一个能够获得s的方法,相当于皇宫里面的太监    
}
console.log(s);//获取不到s的啦这样;

----------------------------------------------
function f1(){
    var s='你特么打我试试?';
function f2(){ 
console.log(s);
}   
return f2; 
}
console.log(f1()());//这样才能获取s的值

-----------------------------------------------
   function f1(){
    var s='你特么打我试试?';
function f2(){ 
console.log(s);
}   
return f2(); 
}
console.log(f1());//或者这样才能获取s的值

//那f2和f2()的区别是什么呢?简单的说,f2表示f2这个函数本身,f2加了括号后,就是执行这个函数。你可以自己写个函数,console.log一下看看。

所以大牛们为了方便,往往写成以下形式:
function f1(){
var s='你特么打我试试?';
return function f2(){console.log(s)};//这样返回了f2这个函数体本身,没有执行
}
f1()();这样就Ok了;

 

posted @ 2017-12-30 13:54  风说云走  阅读(70)  评论(0)    收藏  举报