为了账号安全,请及时绑定邮箱和手机立即绑定

js闭包的问题

js闭包的问题

哔哔one 2019-02-14 18:15:22
<!doctype html><html><head></head><body>    <script type="text/javascript">    <!-- 在正常的脚本中,某个方法可以获取到外部的变量,或者全局变量 -->    var num = 11;    function func1(){        console.log(num);    }    func1();    <!-- 但是在外部是无法获取方法内部的局部变量的 -->    function func2(){        var num1 = 22;        num2 = 33;    }    func2();    <!--console.log(num1);  会报错!-->    console.log(num2); <!--可以获取到num2的值,因为不适用var定义变量时,默认是全局变量 -->    <!-- 那么如何在外部获取到内部的变量呢!javascript可以办到 -->    function func3(){        var num3 = 44;        function func4(){            return num3;        }        return func4;    }    var func = func3();    console.log(func());    </script></body></html>第三个中...为什么不直接return num3呢。。。在外面包一个func4有什么区别。。。。。。不都是返回num3吗。。求大神解惑。。这各问题把我弄蒙了
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

1、如果你所有的变量都定义在最外层,也就是window环境下,你要想一想,如果程序变得越来越大,你一个不小心就把某一个变量修改了,bug很难定位

2、闭包简单来说,就是内层函数能够访问到作用域链上的变量。你的例子太简单了,如果单单只返回值,怎么返回都没什么区别,但是如果你是暴露接口方法,使之能操作你函数里面的变量呢?这就又不一样了,只返回值你永远不能在外层对这个变量进行修改,相当于把你的变量封装了起来,外层不能改变他,也就解决了1里的问题

3、如2中所说,你可以


function func3 () {

    var num = 1

    function add () {

        num++

    }

    function getNum () {

        return num

    }

    return {

        add: add,

        getNum: getNum

    }

}

var t = func3()

t.add()

t.getNum()

这样是不是就封装了一些操作了,也变得更加有意义呢?例子还是太简单,只是说明对变量的封装。


查看完整回答
反对 回复 2019-02-21
  • 1 回答
  • 0 关注
  • 384 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信