混淆JavaScript嵌套执行结果

时间:2016-03-28 16:40:54

标签: javascript nested-function

我尝试使用简单的JavaScript嵌套代码,但结果令人困惑。

任何人都可以详细解释一下吗?非常感谢。

我在等......

<script>
  // args = [];

  function foo (param) {
    args= [];
    if (param <= 1) {
      args.push(foo(2));
    } else {
      return param;
    }
  }

  foo(1)
</script>

最终的 args [] ,我想外面的 args < / em> [2] )被嵌套的内部 args 覆盖(其中是 [] )。谁可以详细解释结果?执行顺序如何?谢谢。

3 个答案:

答案 0 :(得分:1)

你的代码调用foo函数两次 1.当foo运行语句时,foo(1)是第一个调用

if (param <= 1) {
  args.push(foo(2)); // run here for the first call of foo 
} else {
  return param;
}

类似
if (param <= 1) {
  var foo2= foo(2); // -> trigger the second call of foo
  args.push(foo2); // first element is pushed in args
} else {
  return param;
}

在第二次调用foo(2)param = 2然后,foo2 = 2对上面的代码, 最后,你得到一个只有一个项目和args [0] = 2

的数组

编辑:

args没有覆盖,你已经将args声明为foo函数的局部变量,然后当调用foo(1)时,它会创建一个args变量。当调用foo(2)时,会创建另一个args。

答案 1 :(得分:0)

args = [];

  function foo (param) { // param is 1
    if (param <= 1) { // param <= 1 is true
      args.push(foo(2)); // so args is now [foo(2)]
    } else { // ignored
      return param;
    }
  }

  /*
    This is foo(2) is computed
    function foo (param) { // param is 2
    if (param <= 1) { // param <= 1 is false, so this if statement is ignored
      args.push(foo(2));
    } else {
      return param; // returns 2
    }
  }
  */

  foo(1) // args is [2]

答案 2 :(得分:0)

来自@Dmitry,谢谢。

args是全局绑定(因为您不使用var)。在第一次通话foo(1)中,您将其设置为:

args -----> [];

然后通过递归调用向其添加2。但是,当您递归调用foo 重新绑定全局foo标识符到内存中的新数组时,仍保留旧数组

args -----> []  // new array

     -----> [] // old one

因此,当从递归返回时,您将旧的添加2:

args -----> []  // new array

     -----> [2] // old one

退出后,args绑定到新的空白,并且错过了对旧的引用(它将是GC&#39;)。

请参阅绑定和变异主题:http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/#name-binding