我尝试使用简单的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 覆盖(其中是 [] )。谁可以详细解释结果?执行顺序如何?谢谢。
答案 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;)。