请求分析js代码执行顺序,以及函数调用

DD_mmy 发布于:2015-11-12 22:13 栏目:原创 浏览:1040 评论:3
1.下面是代码:
function outer(){
          for(var i= 0,arr=[];i<3;i++){
              arr[i]=function(){
                  return i;
              }
              return arr;
          }
      }
      var getFuns=outer();
      /*getFuns[
       function(){return i}
       function(){return i}
       function(){return i}
      ]*/
      console.log(getFuns[0]());
      console.log(getFuns[1]());
      console.log(getFuns[2]());
为什么上面输出结果全都是3,函数是怎样进行调用执行的?




2. 异常处理
var n;
function fun(){
            try{
                 n=1;
                 console.log(m);
       
                 return n;
            }catch(err){
                 n=2;
                 return n;
 
            }finally{
                 n=3;
                 return n;
   
          }
 }
console.log(fun());
console.log(n);
沙发#
发布于:2015-11-13 00:21
(第一个demo好像return arr;的位置有问题啊。)  这个问题之前@张天师发帖说过了,调getFuns[]()的时候会去调function(){return i};但是匿名函数里面没有定义i,所以它会去上层找,而这个时候上层循环已经结束,i=3,所以最后打印出来的都是3. 要想打出0/1/2的效果就要显式的传入i,
function outer(){
        for(var i= 0,arr=[];i<3;i++){
                (function(i){
                        arr=function(){
                                return i;
                        }
                })(i);
                console.log("i : " + i);
        }
        return arr;
}
第二个感觉好理解啊,try{}catch{}不管有没有抓到异常都会在最后执行finally,所以n就是3了

我理解的就到这了,
板凳#
发布于:2015-11-13 20:29
violencor:(第一个demo好像return arr;的位置有问题啊。)  这个问题之前@张天师发帖说过了, 调getFuns[]()的时候会去调function(){retur...回到原帖
谢了
地板#
发布于:2015-11-16 10:25
DD_mmy:谢了回到原帖
其实是局部变量作用域的问题,闭包函数可以说是在一个函数内定义,在全局下调用,因为是在函数里面定义,所以它能获取到函数的局部变量,像上面的例子,闭包函数arr在outer内部定义,在全局下getFuns调用,getFuns能获取到outer的局部变量i。在执行getFuns的时候outer已经结束,但是因为getFUns有i的链接,所以i没有被回收,而是以最终值3存在,所以getFuns拿到了3;  后来用自调闭包的方式定义arr时,可以理解是把outer的局部变量i变成了arr的局部变量,所以getFuns在执行时,拿到了自己的局部变量i。
游客

返回顶部