由于typescript 2.0 RC(甚至是beta?),因此可以使用数字文字类型,如type t = 1 | 2;.是否可以将类型限制为数字范围,例如0-255,而无需在类型中写出256个数字?
在我的例子中,一个库接受0-255的调色板的颜色值,我更喜欢只列举一些,但将其限制为0-255:
const enum paletteColor {
someColor = 25,
someOtherColor = 133
}
declare function libraryFunc(color: paletteColor | 0-255); //would need to use 0|1|2|...
Run Code Online (Sandbox Code Playgroud) 我想了解在哪种情况下,没有进一步使用的变量存储在闭包中并导致内存泄漏.我最喜欢的结果是"没有",但似乎并非如此.
根据我的理解,一旦函数在另一个函数内声明,其内部[[scope]]被赋予其封装函数的LexicalEnvironment.此LexicalEnvironment在此时引用局部变量和整个范围链.这基本上包括函数可以访问的所有自由变量(从我对lostechies的理解,javascript闭包解释).
这里出现了第一个问题:这应该意味着只要函数存在,就可以达到所有这些变量.例如,以下应该已经泄漏:
function a() {
let big = new Array(1000000).join('*'); //never accessed
//function unused() { big; }
return () => void 0;
}
let fstore = [];
function doesThisLeak() {
for(let i = 0; i < 100; i++) fstore.push(a());
}
doesThisLeak();Run Code Online (Sandbox Code Playgroud)
幸运的是,我的firefox似乎并非如此.我已经收到了几个解释,为什么这不会泄漏,从"抖动是聪明的"到"LexicalEnvironment是一种记录类型,这意味着GC可以收集未使用的变量".我仍然不知道是否正确,这是否在所有现代运行时间都没有泄漏以及为什么.
经过进一步的研究,我发现auth0,javascript中有四种类型的泄漏(遗憾的是,似乎没有跳转到的html id,相关部分是"4:Closures"),它显示了一种方法来欺骗任何聪明的东西收集未使用的变量 在上面的代码片段中,当只是取消注释"未使用"的功能时,我没有看到RAM的使用率再次下降(已经注意到GC可能因为其他原因而无法运行.但是,到目前为止,我假设它泄漏.我也被告知这仅限于firefox,但它似乎在chrome中产生类似的行为)
这个例子(如果它确实做了我认为它做的事情),表明由于同一范围内的函数声明,完全未使用的变量可能会泄漏.
总结我的问题:
PS:很难确定这个问题还没有在关于内存泄漏问题的丛林中被问到.