Javascript 为什么在递归中使用let替换var更好?
当我尝试做一个LeetCode问题#25时,使用var不能通过,但使用let可以通过 变量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
有人能解释一下吗?这似乎是个错误。(var j=0;i
下面的代码通过了所有测试,只需将第二个循环中的i改为j即可:您可以参考这个来获得详细的答案:,基本上是关于变量范围以及javascript如何访问这些定义的变量
var
使您的变量成为全局变量,以及让使它们成为它们所在范围的局部变量。@ROOTvar
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