试图创建私有函数时JavaScript与闭包混淆

试图创建私有函数时JavaScript与闭包混淆,javascript,scope,closures,Javascript,Scope,Closures,我试图创建一种类似类的方式来访问带有公共和私有函数/变量的对象,但是我有点困惑为什么这个简单的测试代码不起作用 //只有一个值的类类型对象。 函数播放(arg){//构造函数。 var检验=arg; //私密的,因为不是用“这个”来声明的。显然将来会更复杂。 private_settest=函数(val){ 试验=val; } //公众。 this.settest=函数(val){ 私家侦探(val); } this.gettest=函数(){ 回归试验; } } var a=新游戏(1);

我试图创建一种类似类的方式来访问带有公共和私有函数/变量的对象,但是我有点困惑为什么这个简单的测试代码不起作用

//只有一个值的类类型对象。
函数播放(arg){//构造函数。
var检验=arg;
//私密的,因为不是用“这个”来声明的。显然将来会更复杂。
private_settest=函数(val){
试验=val;
}
//公众。
this.settest=函数(val){
私家侦探(val);
}
this.gettest=函数(){
回归试验;
}
}
var a=新游戏(1);
var b=新剧本(2);
a、 settest(100);
log(a.gettest());
log(b.gettest())
这隐式定义了一个全局变量
private\u settest
,当您构造
new Play()
时,每次都会覆盖全局变量,引用上次初始化的
Play
实例的范围,在本例中为
b
。正如您所观察到的,这就是为什么“private”函数访问第二个实例的作用域。这应该改为

function private_settest(val) {
    test = val;
}
以便在每个实例的作用域内正确声明函数

//只有一个值的类类型对象。
函数播放(arg){//构造函数。
var检验=arg;
//私密的,因为不是用“这个”来声明的。显然将来会更复杂。
函数私有设置测试(val){
试验=val;
}
//公众。
this.settest=函数(val){
私家侦探(val);
}
this.gettest=函数(){
回归试验;
}
}
var a=新游戏(1);
var b=新剧本(2);
a、 settest(100);
log(a.gettest());

log(b.gettest())
问题在于
private\u settest
是一个全局变量。您没有使用
var
let
const
function
)声明具有局部作用域的函数变量。因此,每次调用构造函数时,该函数的早期版本都会被覆盖

然后调用
a.setttest
时,实际上(通过该方法)调用了修改私有变量
test
的单个全局函数,该变量实际上是
b
实例(创建的最后一个实例)的私有变量


如果您使用的是
“use strict”
,您会收到一条关于此的错误消息。

private\u settest=function(val){test=val;}
应该是
function private\u settest(val){test=val;}
,您不希望输出为100 2吗?始终使用严格模式!
function private_settest(val) {
    test = val;
}