闭包情况下的函数调用

<script>

function fn1(){
    var a=123;
    function fn2(){            
        alert(a)
    }
}
fn1()//在调用函数fn1的时候,fn2这个函数已经被读取到了
fn2()//但是调用fn2时却报错,这是什么原因呢?哪里理解不对吗?

</script>

阅读 4.6k
9 个回答

f2是在f1里声明的 你在外面调肯定报错呀
你应该改成return f2()
调用的时候用f1()()就可以了

fn2对外部来说是不可见的
fn2在局部作用域fn1的肚子里
你能看到你肚子里的东西吗。。

function fn1(){
    var a = 123;
    return fn2() {
        console.log(a);
    }
}

var fn2 = fn1(); // 将fn2函数返回到全局作用域并赋值给一个变量
fn2(); // 然后才可以在全局作用域下调用 => 123

这就是典型的函数作用域的问题!

换种写法

function fn1(){
    var a=123;
    var fn2 = function(){            
        alert(a)
    }
}

在fn1中,a和fn2都可以理解为私有属性,即不对外公开的。
若要公开,需要把私有属性return出去。

lz可以去看看《JavaScript面向对象编程指南(第2版)》这本书中对闭包的介绍,个人觉得比较详细,易于理解。

新手上路,请多包涵

函数体是局部作用域,你的写法fn2只是局部变量,采用return fn2 赋值给一个全局变量后才能调用。

在这里fn2只对函数fn1可见,全局作用域不能访问函数fn2的。楼主把代码改成这样应该就能访问了:

function fn1(){
    var a=123;
    function fn2(){            
        alert(a)
    }
    return {
        fn2
    }
}
fn1().fn2()    //输出 123
新手上路,请多包涵

把a 当参数穿进去

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