Javascript排列魔术

Javascript排列魔术,javascript,permutation,Javascript,Permutation,我正在阅读一些算法,试图理解javascript中的排列,下面的一个让我大吃一惊 var permArr = [], usedChars = []; function permute(input) { var i, ch, chars = input.split(''); for (i = 0; i < chars.length; i++) { ch = chars.splice(i, 1); usedChars.push(ch); if (chars.le

我正在阅读一些算法,试图理解javascript中的排列,下面的一个让我大吃一惊

var permArr = [], usedChars = [];
function permute(input) {
  var i, ch, chars = input.split('');
  for (i = 0; i < chars.length; i++) {
    ch = chars.splice(i, 1);
    usedChars.push(ch);
    if (chars.length == 0) permArr[permArr.length] = usedChars.join('');
    permute(chars.join(""));
    chars.splice(i, 0, ch);
    usedChars.pop();
  }
  return permArr
}
如果我在代码中的console.log(i)或console.log(ch)之前或之后输入,它将返回undefined where。 如果我去掉i和ch,算法就不再有效了

有人能给我解释一下这句话以及它是如何工作的吗? 非常感谢

不需要魔法 声明变量
i
ch
chars
,并将其赋值给
chars
what
input.split(“”)
返回

基本上相当于

var i; // undefined
var ch; // undefined
var chars = input.split(''); // Array of string
这通常是为在循环迭代中可用的变量而做的(以访问以前的值)

然而。。。
i
只是循环变量,可以像中一样内联声明

for (var i = 0; i < chars.length; i++) {

这使得这个例子确实令人困惑(可以说它写得很糟糕)

让你困惑的一行有一个名字:“Javascript多重左手赋值”。您还对
var x='blah'之间的细微差别感到困惑
x='blah'
。有助于解释这种差异的链接:它与在for循环中创建和销毁变量的范围有关,或者与在每次迭代中保持变量的范围有关。要查看这一点,请在循环的每个迭代中打印ch。在循环内部或外部定义ch具有重要意义。非常感谢您的回答,但是,当我删除这两个时,为什么算法不再有效?
var i; // undefined
var ch; // undefined
var chars = input.split(''); // Array of string
for (var i = 0; i < chars.length; i++) {
  for (var i = 0; i < chars.length; i++) {
      var ch = chars.splice(i, 1);