我无法掌握结果。我了解前两组输出( func01 1 和 func2 01-func2 05 )。但是其余的令人困惑。
我的理解是,在func01()
中第一次执行for循环之后,由于函数func02()
,我到达2,然后是3,但是在{{1 }}。我不知道为什么输出中没有 func01 2和func01 3 。
func01()
答案 0 :(得分:1)
这是我得到(格式化)的结果
func01 1
func02 1
func02 2
func02 3
func02 4
func02 5
func01
被调用,将i(全局变量)设置为1,并打印一行
然后func01
呼叫func02
func02
将i重置为1,然后为每个i=1,2,3,4,5
打印一行。
然后控制权返回到func01
。它已经完成了第一次循环迭代。 i的值为5。然后将i(作为其全局变量)与3进行比较。看到5更大,循环就结束了。
答案 1 :(得分:1)
在不使用var
的情况下分配变量,并且该变量在当前作用域中不存在时,将在下一个作用域中查找它。如果不存在,则检查下一个作用域,依此类推。
如果在 any 范围内找不到该变量,则会将其分配给全局范围。因此func01
和func01
都引用并更新了相同的i
变量。因此func02
运行,循环并完成。然后到func01
时,i
为6
,循环不再在func0
中运行。
如果将计数器更改为使用var
,则可以得到预期的结果。这样会将i
的范围限制在它们内部的功能上。
function func02(){
for (var i = 1; i <= 5; i++){
document.write(" func02 " + i + "<br>");
}
}
function func01(){
for(var i = 1; i <= 3; i++){
document.write("func01 " + i + "<br>");
func02();
}
}
func01();
答案 2 :(得分:0)
您尚未将i
定义为局部作用域变量,因此将其创建为全局变量。使用let
或var
:
function func02(){
for (i = 1; i <= 5; i++){
document.write(" func02 " + i + "<br>");
}
}
function func01(){
for(i = 1; i <= 3; i++){
document.write("func01 " + i + "<br>");
func02();
}
}
func01();
答案 3 :(得分:0)
user202729是正确的。在javascript中,如果不声明变量,它将采用全局范围,而不是采用使用该变量的函数范围。
声明您的变量i ,如下所示,
for(var i = 1;i <= 5 ; i++)
或者您可以在函数的开头声明变量,例如
var i;
function func02(){
for (var i = 1; i <= 5; i++){
document.write(" func02 " + i + "<br>");
}
}
function func01(){
for(var i = 1; i <= 3; i++){
document.write("func01 " + i + "<br>");
func02();
}
}
func01();
请参考https://www.w3schools.com/js/js_scope.asp并查找有关javascript变量作用域的信息。