js闭包问题

var fn = null;
function foo() {
    var a = 2;
    function innnerFoo() { 
        console.log(c);
        console.log(a);
    }
    fn = innnerFoo; 
}

function bar() {
    var c = 100;
    fn();
}

foo();
bar();

小白搞不懂了,求大神告知这里输出什么,为什么?

阅读 2.1k
3 个回答

foo执行的时候,innnerFoo会复制foo的作用域链,形成闭包,所以fn执行的时候,也就是innnerFoo执行会沿着作用域链向上寻找a,可以找到为2,但是找不到ccbar函数中的作用域链中,innnerFoo没有在此作用域链中声明c,所以会报错

其实这个题改成

var fn = null;
var c=3;//新增
function foo() {
    var a = 2;
    var c=1;//新增
    function innnerFoo() { 
        console.log(c);
        console.log(a);
    }
    fn = innnerFoo; 
}

function bar() {
    var c = 100;
    fn();
}

foo();
bar();

更有意义,成为javascript变量作用域的概念很好的例题

了解词法作用域,你不知道的JS很不错,建议看看

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