Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在递归中使用let替换var更好?_Javascript_Recursion_Ecmascript 6_Var_Let - Fatal编程技术网

Javascript 为什么在递归中使用let替换var更好?

Javascript 为什么在递归中使用let替换var更好?,javascript,recursion,ecmascript-6,var,let,Javascript,Recursion,Ecmascript 6,Var,Let,当我尝试做一个LeetCode问题#25时,使用var不能通过,但使用let可以通过 变量 有人能解释一下吗?这似乎是个错误。(var j=0;ifor(var i=0;i

当我尝试做一个LeetCode问题#25时,使用var不能通过,但使用let可以通过

变量


有人能解释一下吗?

这似乎是个错误。(var j=0;i 由于某种原因,For循环没有在第13行终止…终止条件是当iABOVE在第一个For循环中时

这就是let vs.const的用武之地

您已经将第二个for循环中使用的i声明为与第一个for循环相同的i(var i=0)

使用var会立即提升变量,将其置于全局范围/词汇上下文中

在第一个循环中将var更改为let,会在第二个循环的词汇上下文中导致“reference i not defined”:

javascript中的函数在任何时候执行时,都会使用特定的“执行上下文”,其中包含映射变量到值的词汇环境/上下文

函数执行上下文是根据调用时的位置生成的。在这种情况下,第二个for循环的执行上下文在其第一个循环上的值为i=k,这是它的停止条件

最后,在第一个循环中,停止条件是前一个节点不为null。由于第二个for循环从未运行过(关键:它使用与第一个for循环相同的i值和停止条件!),因此reverseKGroup(cur,k)将使用等于head的cur值重复执行,只要head不为null,就会导致无限循环


下面的代码通过了所有测试,只需将第二个循环中的i改为j即可:

您可以参考这个来获得详细的答案:,基本上是关于变量范围以及javascript如何访问这些定义的变量
var
使您的变量成为全局变量,以及
使它们成为它们所在范围的局部变量。@ROOT
var
doesn不能使它们成为全局变量。
var
是函数的局部变量,
let
是块的局部变量。@Barmar,我想在这里用我的话。你必须用
let
声明哪些变量才能使其工作?所有这些变量?你有样本输入和预期输出吗?一个最小的例子很好。在中重用I有点奇怪de>for(var i=0;i
由于i未在第二个循环中声明。OP声明i一次,无需在函数中再次声明。由于变量声明是在执行任何代码之前处理的,因此使用var对i的多个声明没有影响。使用var,第二个循环将永远不会运行,因为
i
已从fir失败st循环和i不会重置。如果声明更改为let,我希望第二个循环在
i
i++
处抛出一个引用错误,因为我没有在该块或范围链的更高位置声明(除非它来自未显示的地方)。@RobG澄清:“将i更改为j”指的是第二个for循环的停止条件“i”和迭代器“i++”。我想这可能有点混淆。Re“var的多个声明没有影响”是的,我希望答案似乎没有暗示这一点。问题恰恰是因为让第二个循环的停止条件与第一个循环的停止条件匹配是没有意义的。因此,从I到j的交换。也就是说——我的答案与你所说的停止条件到底有什么不同?干杯。这可能是问题所在,但事实并非如此没有解释范围错误,也没有解释代码为什么与let一起工作。这可能与执行代码的环境有关。
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var reverseKGroup = function(head, k) {
    var p = head;
    var cur = head;
    var pre = null;
    for(var i=0; i< k; i++) {
        // 如果里面没走到最后就结束,则直接返回这部分链表 不需要再反转
        if(p == null) return head;
        p = p.next;
    }
    // 反转部分链表
    for(var j=0 ; i< k; i++) {
        var temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    // 此时的尾部即为一开始的头部,next 为接下来反转
    head.next = reverseKGroup(cur, k);
    return pre;
};
Line 13 in solution.js
var reverseKGroup = function(head, k) {
                            ^
RangeError: Maximum call stack size exceeded