小编ASD*_*rte的帖子

是否可以将数量限制在一定范围内

由于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)

types typescript

37
推荐指数
8
解决办法
1万
查看次数

关闭未使用变量的内存泄漏

我想了解在哪种情况下,没有进一步使用的变量存储在闭包中并导致内存泄漏.我最喜欢的结果是"没有",但似乎并非如此.

根据我的理解,一旦函数在另一个函数内声明,其内部[[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中产生类似的行为)

这个例子(如果它确实做了我认为它做的事情),表明由于同一范围内的函数声明,完全未使用的变量可能会泄漏.

总结我的问题:

  1. 在上面的片段中,"大"收集(当"未使用"被评论时)并且在所有现代运行时间发生这种情况的原因是什么?
  2. 假设具有"未使用"功能的示例未注释泄漏,那么避免此类意外泄漏的最佳做法是什么?还有吗?我已经得到了在函数结束时没有进一步使用的所有局部变量的建议,但这看起来很荒谬.我担心使用临时变量进行预先计算和意外泄漏.

PS:很难确定这个问题还没有在关于内存泄漏问题的丛林中被问到.

javascript

14
推荐指数
1
解决办法
910
查看次数

标签 统计

javascript ×1

types ×1

typescript ×1