Javascript 部分暴露模块安全问题,签名中的默认值

Javascript 部分暴露模块安全问题,签名中的默认值,javascript,encapsulation,getter-setter,revealing-module-pattern,Javascript,Encapsulation,Getter Setter,Revealing Module Pattern,在ES6语法的模块模式中,默认变量的状态似乎取决于函数的尾部()(调用) 但是,由于对访问函数体中的下划线变量感到疑惑,一些trippy的东西似乎出现了几种不同的变体 通过RM模式的几个半成品、半记忆的迭代来进一步研究;无论是完全的生活,还是仅仅是独立的生活,开始了它,但后来它演变成了看x、y和z是如何被访问的 添加尾随的()时,错误消失,但接受值的.\ux的行为仍然存在。应该吗 在所有这些情况下,可以使用ES6语法的变体将默认值添加到模式中吗 const=function(x='fish',

在ES6语法的模块模式中,默认变量的状态似乎取决于函数的尾部()(调用)

但是,由于对访问函数体中的下划线变量感到疑惑,一些trippy的东西似乎出现了几种不同的变体

通过RM模式的几个半成品、半记忆的迭代来进一步研究;无论是完全的生活,还是仅仅是独立的生活,开始了它,但后来它演变成了看x、y和z是如何被访问的

添加尾随的
()
时,错误消失,但接受值的
.\ux
的行为仍然存在。应该吗

在所有这些情况下,可以使用ES6语法的变体将默认值添加到模式中吗

const=function(x='fish',y='chicken',z='beef')){
//console.log(x)
_x
_y
_z
返回{
//_x,,
//是的,
//_z,,
get x(){返回这个。x},
设置x(值){this.\ux=value}
}
}()//如果您调用它,它本身不会被破坏,但是显示模块变量的状态是什么?
// _()
让x
_.x='fish ly'//强烈劝阻,但为什么它会起作用呢?
console.log(x)
x='tartwell'
console.log(x)
console.log(u.x)//应该是私有的吗?
console.log(ux.x)
x='o.m.g'
console.log(x)
console.log(u.x)//fishly
console.log(\ux)//没有更改,但给出了未定义的
console.log(\ux)//没有更改,但给出了未定义的
_.x[\u.\x]//类型错误:无法读取未定义的属性'fishly'
console.log('x',_u.x)//with call()尾部函数restored log显示在上面的语句中分配了x
//_ux=‘绿叶蔬菜’

console.log(u.x)
您已经将
\uu
定义为一个函数。函数作为对象,可以为其指定任意键值对(不幸的是)。所以

将为单个函数对象的
\ux
属性分配一个属性(任何想要引用
\ux
的对象都可以查看)。闭包作用域变量(不是属性)
\ux
\uy
\uz
仍然被正确封装(它们只能通过
\ucode>函数故意公开的内容进行更改和查看),但在调用
\ucode>函数之前不会创建它们

在您的代码段中,您从未调用过
\uu
,因此为了更清楚地了解在完全相同的结果下发生了什么,您不妨将
\u
替换为名为
{}
的空对象:

constobj={};
设x;
obj.x='fish ly'//强烈劝阻,但为什么它会起作用呢?
//因为它只是对象上的一个键值对
console.log(obj.\u x)//哪些是公共的
console.log(obj.x)//没有更改,但给出了未定义的

//因为唯一的属性是“x”,而不是“x”
OK,这确实帮助我理解。您能解释一下为什么在分配给
.\ux
后,第一个
控制台.log(.\ux)
返回分配的值,但随后返回未定义的
?但是,在TypeError消息中,
.\ux[.\ux]
会显示一个值。我明白,这可能只是一个不做对象期望的事情,但如果,正如你所说,对象就是这样做的,我的感觉是,这可能是一个糟糕的情况。。。想法?(1)因为,正如代码片段所说:它给出了未定义的
,因为唯一的属性是“\ux”,而不是“x”
(如果你把它分配给
.x
,而不是
。\ux
你会在检查
.x
时看到一些东西),需要调试的是我自己的眼睛。(2)
\ux[\ux.\ux]
的计算结果为
\ux['fish-ly']
-查找
\ux
x
属性,然后在该属性上查找
fish-ly
属性。但是
x
属性未定义,因此错误
未捕获类型错误:无法读取未定义的
的属性'fish ly'。所有这些下划线让事情变得困难,我建议避免它们。我认为他们从未为可读性添加任何有用的内容。它试图查找对象上的
x
属性,但
\uuux
的计算结果为
未定义。这不是抛出错误的原因。问题是试图在
未定义的
上查找属性<代码>.\ux[.\ux]
的计算结果为
.\ux['fish-ly']
,它是
未定义的['fish-ly']
抛出的。
_._x = 'fish-ly'