一、闭包是什么
查阅了些许文档,个人理解如下:
闭包是为了读取函数内部变量而发明的。
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了;