这是将变量设置为私有的正确方法吗?
function test(a, b){
let aa = a
let bb = b
return {
getA: () => {
return aa
},
getB: () => {
return bb
}
}
}
现在我无法直接访问aa
和bb
。如果我将this
关键字放在变量的前面,它将被接受为对象吗?我知道JavaScript函数是对象,但它变得更像对象语法。我对所有JavaScript选项感到困惑。似乎任何事物都没有约定。
this
类型:
function test(a, b){
this.aa = a
this.bb = b
return {
getA: () => {
return this.aa
},
getB: () => {
return this.bb
}
}
}
两个例子似乎与我相同。问题总和-这些变量的私有性是通过这些方式实现的吗?
答案 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);
第二个代码块中的
this
是window
对象。因此aa
不是私有的。与第一个块一样,该块是作用域的且不可访问。因此,aa
在第一个中只是“私有”。
这是“正确”的方式吗?
在我mentioned的情况下,这仅仅是design pattern (revealing module pattern)。警惕“正确”的方式。 “权利”是主观的,并取决于上下文。没有“正确”的方法,但这是构造这种事物的常用方法。
这只是使用closure来定义变量的范围。因此,js中没有“私有”声明。只是作用域变量。