Javascript 部分暴露模块安全问题,签名中的默认值
在ES6语法的模块模式中,默认变量的状态似乎取决于函数的尾部()(调用) 但是,由于对访问函数体中的下划线变量感到疑惑,一些trippy的东西似乎出现了几种不同的变体 通过RM模式的几个半成品、半记忆的迭代来进一步研究;无论是完全的生活,还是仅仅是独立的生活,开始了它,但后来它演变成了看x、y和z是如何被访问的 添加尾随的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',
()
时,错误消失,但接受值的.\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'