在短期变量中使用 let 和 const

atm*_*tmd 2 javascript ecmascript-6

假设我有一个短暂的变量,GC 会很快清理它,例如:

function doSomeThing() {
  var someValue = someCalculation();
  return someValue;
}
Run Code Online (Sandbox Code Playgroud)

现在假设这someCalculation()实际上是一个占位符,用于需要将其返回值设置为变量的东西,或者可能是反应中的东西,例如:

render() {
  var someComponent = someValues.map(someComponentFactory());
  return (
    <div>    
      <someComponent />
    </div>
  )
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下someComponentsomeValue都是短期变量,一旦函数返回就会被清除。

let使用和时的正确方法是什么const

const有意义,因为值不会改变,但是let有意义是因为您没有真正设置“常量”值,它会立即被丢弃。

我试图找到 javascript 引擎的工作方式或某些性能原因,你会使用其中之一,但我找不到任何东西。

所以问题是,当声明一个立即丢弃的变量时,你应该使用letorconst吗?

Kev*_*Bot 5

使用const不会让你“帮助”垃圾收集。有时,开发人员遵循的模式是取消设置变量以表明该变量已准备好进行垃圾收集。

例如:

function doSomeThing() {
    let someValue = someCalculation();
    // pass off to another function
    anotherFunction(someValue);
    someValue = null;
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用const,则无法重新分配someValuenull。但是,当没有更多活动代码引用它时,无论如何它都会被垃圾收集,这会回退到您最初编写的内容。所以取消设置确实是唯一的区别。

以下是《你不懂 JS》中关于该主题的一个小片段:

警告:将对象或数组分配为常量意味着该值将无法被垃圾收集,直到该常量的词法范围消失,因为对该值的引用永远无法取消设置。这可能是可取的,但如果这不是您的意图,请小心!

  • 只是在这里澄清一下......在这种情况下,`someValue = null` 没有什么区别,因为 `doSomeThing()` 的范围无论如何都会被破坏。将变量设置为“null”的模式(这就是我在书中引用的注释中提到的内容)是为了让它引用的值(如对象或数组)比当父作用域消失时,在作用域将保留很长一段时间的情况下(通常是因为关闭),但我们已经完成了该值。 (2认同)