这是我的代码:
function func(){
for(i=0; i < 5; i++){
alert('B');
}
}
for(i=0; i < 5; i++){
func();
alert('A');
}
我的预期是:BBBBBABBBBBABBBBBABBBBBABBBBBA
但收到的只是BBBBBA
我发现那是因为JS中存在函数范围,而不是块范围。我想知道的是如何保持这种行为。我的意思是强制阻止范围。否则很容易制造出令人讨厌的错误 - 例如使用其他人写的功能或你自己编写的功能,但几个月前。
答案 0 :(得分:5)
请务必使用var i=0
而不是i=0
。否则,它会浮动到全局范围,并被两个循环使用。
function func(){
for(var i=0; i < 5; i++){
alert('B');
}
}
for(var i=0; i < 5; i++){
func();
alert('A');
}
答案 1 :(得分:3)
问题在于i
是全局变量。用户var
将其范围限制为func
函数:
function func(){
for(var i=0; i < 5; i++){
alert('B');
}
}
使用声明方式的变量的函数不会污染全局命名空间。
答案 2 :(得分:2)
在函数func
function func(){
for(var i=0; i < 5; i++){
alert('B');
}
}
答案 3 :(得分:2)
不要使用全局变量(正如您所注意到的那样,可能会被所有代码意外更改。这与词法作用域无关,在C中也会发生类似代码)。而是将每个变量设为本地:
function func(){
for(var i=0; i < 5; i++){ // var
alert('B');
}
}
for(var i=0; i < 5; i++){ // var
func();
alert('A');
}
答案 4 :(得分:2)
function func(){
for(var i=0; i < 5; i++){
console.log('B');
}
}
for(var i=0; i < 5; i++){
func();
console.log('A');
}
这应该对你有用
答案 5 :(得分:1)
使用var
将i
设为本地:
function func(){
for(var i=0; i < 5; i++){
alert('B');
}
}
for(i=0; i < 5; i++){
func();
alert('A');
}