这是将变量设置为私有的正确方法吗

时间:2018-11-30 11:26:43

标签: javascript

这是将变量设置为私有的正确方法吗?

function test(a, b){
        let aa = a
        let bb = b
        return {
            getA: () => {
                return aa
            },
            getB: () => {
                return bb
            }
        }
    }

现在我无法直接访问aabb。如果我将this关键字放在变量的前面,它将被接受为对象吗?我知道JavaScript函数是对象,但它变得更像对象语法。我对所有JavaScript选项感到困惑。似乎任何事物都没有约定。 this类型:

function test(a, b){
        this.aa = a
        this.bb = b
        return {
            getA: () => {
                return this.aa
            },
            getB: () => {
                return this.bb
            }
        }
    }

两个例子似乎与我相同。问题总和-这些变量的私有性是通过这些方式实现的吗?

1 个答案:

答案 0 :(得分:1)

这些代码块不相等。见下文:

function test(a, b){
        let aa = a
        let bb = b
        return {
            getA: () => {
                return aa
            },
            getB: () => {
                return bb
            }
        }
    }
    
let testResult = test(1, 2);
console.log(testResult.aa)
//error
console.log(aa);

vs

function test(a, b){
        //this here === window
        this.aa = a
        this.bb = b
        return {
            getA: () => {
                return this.aa
            },
            getB: () => {
                return this.bb
            }
        }
    }
    
let testResult = test(1,2);
console.log(testResult.aa);
//can get aa
console.log(aa);

第二个代码块中的

thiswindow对象。因此aa不是私有的。与第一个块一样,该块是作用域的且不可访问。因此,aa在第一个中只是“私有”。

  

这是“正确”的方式吗?

在我mentioned的情况下,这仅仅是design pattern (revealing module pattern)。警惕“正确”的方式。 “权利”是主观的,并取决于上下文。没有“正确”的方法,但这是构造这种事物的常用方法。

这只是使用closure来定义变量的范围。因此,js中没有“私有”声明。只是作用域变量。