获取函数内部变量,为什么一定要闭包?

张吉林
  • 31

JavaScript为什么不直接将函数的内部变量return出来,而是要通过闭包的方式来实现获取内部变量?
看到有人说防止函数内部变量被修改,有点不理解。

回复
阅读 2.2k
5 个回答
✓ 已被采纳
其实这个跟JS没有私有变量有关

在函数里,如果直接return,比如说

function fun1(){
    var account = {
       name: '张吉林',
       password: '123456'
      }
    // ... (一些操作)
    return account
}

如果是这种形式,那么我们可以直接通过以下方式获取你的账号,甚至于修改你的账号

var account = fun1() // => {name: "张吉林", password: "123456"}
account.password = 'abcdef' // => {name: "张吉林", password: "abcdef"}

因为JS没有私有变量,所以我们只能通过闭包的方式,将账户这种不想暴露出去的信息限制在函数里

function fun2(){
    var account = {
       name: '张吉林',
       password: '123456'
      }
    // ... (一些操作)
    return {
         get() {
             return account
         }
         set() {
             // 比如说这里做一些官方的验证操作,保证账号设置不是非法操作
             // ...
         }
    }
}

如果通过这种形式,那么就将account这个账号信息限制在fun2函数里才能去做的操作

这里只是举个账号的例子,然后类似的还有很多,闭包可以将不想暴露出去的信息限制起来,防止外界调用。
实际上,也会有这种情况。 比如甲方提供给乙方的API,就只需要暴露出甲想提供的东西,对于他们内部使用的一些信息都可以有效的保护起来。

因为除了获取变量,还有改变变量的操作. 如果直接用func.key的方式来获取的话,就能被同样的方式 func.key = xx修改。 所以如果要修改该变量,也应该调用函数给的方法来实现

就是跟你说的一样,防止函数内部的某个变量被改变,所以只提供给外部get的方法,而不提供set的方法。

const internal = (function() {
    var a = "your name";// 此处很重要
    return {
        getA() {
            return a;
        },
        // setA(newA) {
            // a = newA;
        // }
    };
})();

你是不是就不想暴露出来a让外部修改

按我的理解,JS里的函数其实也是一个对象。其内部的变量都是public的,所以外部就可以直接修改这个函数(对象)的变量。
用闭包的话,函数外部就不能直接那样访问了,而是根据你公开的一些方法来操作其内部变量。

看具体场景吧,在什么场景下你需要获取函数内部变量呢?

有的场景里,就是通过函数内部变量return出来。而且这种场景,其实也是利用了闭包。

而你说的利用闭包的方式,也许只是讲解闭包的例子才这么用吧

宣传栏