一个javascript问题。

function f1(){
    var n=999;
    nAdd=function(){
        n+=1
    }
    function f2(){
        alert(n);
    }
    return f2;
}

var result1=f1();
var result2=f1();
result1(); // 999
nAdd();
result1(); // 999
result2(); //1000


为什么输出分别是999,999,1000而不是999,1000,1000
阅读 2.7k
4 个回答

因为n不是全局变量,每次调用f1()都会创建独立的n

那么显然,第二次调用var result2=f1();之后,nAdd里的n就只对result2负责了,于是result1()仍然打印出来的是她自己作用域里的那个999

两点很关键: n是局部变量,nAdd是全局变量!此时,上面的代码应该可以写成这样:

var nAdd;
function f1(){
    var n=999;
    nAdd=function(){
        n+=1
    }
    function f2(){
        alert(n);
    }
    return f2;
}

var result1=f1();
var result2=f1();
result1(); // 999
nAdd();
result1(); // 999
result2()
  1. 这就是一个闭包,在创建result1的时候,n是999,并且独立属于result1的闭包里面,并且第一次给nAdd赋值了,这时候,nAdd里面N 指向result1闭包里面的n。

  2. 紧接着, 创建了result2,此时,由于n是局部变量,会创建新的n,于是,nAdd被再次赋值,并且,此时nAdd里面的n指向的是result2里面的n了。

  3. 所以,运行nAdd改变的仅仅是result2闭包里面的n值!

希望有所帮助!

第二次运行 f1() 的时候,覆盖了 nAdd 的定义,所以 nAdd 是在第二次运行的 f1() 中定义的,所以会改变 result2 的输出。

好好的闭包居然弄了个全局,无法理解这样的运用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题