[Javascript] 闭包 closure

来源:互联网 发布:淘宝穿越火线刷经验 编辑:程序博客网 时间:2024/05/22 06:33

闭包是十分的重要
校招面试的几家公司都要问到闭包的问题
最经典的是问到
闭包是什么 有什么作用
闭包循环和累加的应用
更改闭包的作用域

(1) 概念

全局下 取不到局部的变量的值

<script type="text/javascript">    function a(){      var name1="jessica";      console.log(name1);    }    console.log(name1);    //Uncaught ReferenceError: name1 is not defined </script>

闭包是一个 有权访问另一个函数作用域的变量的函数。且始终放在内存当中

<script type="text/javascript">    function a(){      var name="jessica";      return function(){//匿名函数 闭包的使用         return name;      }    }    console.log(a()());    //jessica</script>

(2) 闭包+变量

问题:闭包只能取到任何变量的最后一个值
块级作用域
(function(){
//块级作用域
})();


(3) 闭包经典案例 - 累加

<script type="text/javascript">   function a(){     var i=100;     return function(){        i++;        return i;     }   }   var b=a();//获取函数   console.log(b());   console.log(b());   console.log(b());   console.log(b());   console.log(b());</script>

这里写图片描述

(4) 闭包经典案例 - 循环

问题:

<script type="text/javascript">  function a(){    var array=[];    for (var i = 0; i < 5; i++) {      array[i]=function(){        return i;      }    }    return array;  }  var b=a();  for (var i = 0; i < b.length; i++) {       console.log(b[i]());//五个5 不是01234   //b[i]调用的是匿名函数,匿名函数并没有自我执行   //等调用的时候, a()已经执行完毕了  };</script>

这里写图片描述


解决:

<script type="text/javascript">  function a(){    var array=[];    for (var i = 0; i < 5; i++) {      array[i]=(function(i){        return i;      })(i);//匿名函数自我执行    }    return array;  }  var b=a();  for (var i = 0; i < b.length; i++) {       console.log(b[i]);  };</script>

这里写图片描述

(4) this对象

<script type="text/javascript"> var name="jessica"; var obj={    name:"krystal",    a:function(){       return function(){        return this.name;      }   /*取到的值为什么是jessica?   因为在闭包中, this指的是window */    } }var b=obj.a();console.log(b());//jessica</script>

这里写图片描述

解决:

(1) that =this

<script type="text/javascript"> var name="jessica"; var obj={    name:"krystal",    a:function(){       var that=this;      return function(){        return that.name;      }    } }var b=obj.a();console.log(b());//krystal</script>

这里写图片描述

(2) call

<script type="text/javascript"> var name="jessica"; var obj={    name:"krystal",    a:function(){       return function(){        return this.name;      }    } } console.log(obj.a().call(obj)); //用obj来冒充, 改变作用域来执行a()</script>
0 0
原创粉丝点击