Javascript 为什么让作用域表示嵌套作用域中未定义变量?

Javascript 为什么让作用域表示嵌套作用域中未定义变量?,javascript,Javascript,我正在尝试运行以下代码: function LCS(s1, s2) { let m = s1.length; let n = s2.length; let table = []; for (let i = 0; i <= m; i++) { table.push([]); for (let j = 0; j <= n; j++) { if (i === 0 || j === 0) { table[i][j] = 0;

我正在尝试运行以下代码:

function LCS(s1, s2) {
  let m = s1.length;
  let n = s2.length;

  let table = [];
  for (let i = 0; i <= m; i++) {
    table.push([]);
    for (let j = 0; j <= n; j++) {
      if (i === 0 || j === 0) {
        table[i][j] = 0;
      } else if (s1[i - 1] === s2[j - 1]) {
        // Both s1 and s2 have the same element on the previous index
        // so increase the length of common subsequence by 1 here
        table[i][j] = table[i - 1][j - 1] + 1;
      } else {
        table[i][j] = max(table[i - 1][j], table[i][j - 1]);
      }
    }
    // We've found the length here.
    let index = table[m][n];
    console.log(`The length of LCS between "${s1}" and "${s2}" is ${index}`);

    // Now to get the sequence we need to backtrack from the m, n th index back to start.
    let i = m;
    let j = n;
    let commonSubSeq = "";
    while (i > 0 && j > 0) {
      // If current character in both strings is same, then it is part of LCS.
      if (s1[i - 1] === s2[j - 1]) {
        commonSubSeq += s1[i - 1];
        i--;
        j--;
      } else if (table[i - 1][j] > table[i][j - 1]) {
        i--;
      } else {
        j--;
      }
    }
    return commonSubSeq
      .split("")
      .reverse()
      .join("");
  }
}

console.log(LCS("AGGTAB", "GXTXAYB"));
我无法理解为什么这个变量在嵌套范围内不可用?

这个答案“这是因为提升而发生的”是不完整的。
i
抛出引用错误的原因是由于提升**。JS没有查看循环头(其中
i
已声明并分配给
0
)的原因是因为有两个不同的作用域。循环头中的第一个,循环体中的第二个(在括号{}之间)

**
设i=m
将在for循环的顶部声明变量
i
。由于
let
const
的“提升”与所有其他类型声明使用的提升不同,
i
将被声明为未分配。`


与声明时分配给
未定义
var
不同,让变量保持未分配

您将
let
ing
i
两次,一次在for循环上,一次在第一个
控制台后。log
let i=mi
。但是它们都是不同的作用域,不是吗?第一个在for循环中,而另一个在函数body.No中。第二个
i
在for循环内。哦,所以也会提升变量,但没有值。
      if (i === 0 || j === 0) {
      ^

ReferenceError: i is not defined
    at LCS (C:\Users\LCS-new.js:9:7)