由于涉及两个单独的函数,即_GetFoo
和_CountBar
变量bar
不应该在不同的范围内,即使它们都使用它?如果您复制粘贴然后运行它,它将显示两个警报的问题。
<script type="text/javascript">
var example = function () {
var Foo = [];
function _BuildFoo(size) {
for (var buildSize = 0; buildSize < size; buildSize++) {
Foo.push(buildSize);
}
}
function _GetFoo(index) {
for (bar in Foo) {
//do Foo bar
}
}
function _CountBar() {
for (bar in Foo) {
alert(bar); //bar = 0
_GetFoo(1);
alert(bar); //bar is incremented from _GetFoo function and is now 19
break;
}
}
return {
_CountBar: _CountBar,
_BuildFoo: _BuildFoo
}
}
var foobar = new example();
foobar._BuildFoo(20);
foobar._CountBar();
</script>
为什么_GetFoo
和_CountBar
分享范围?
答案 0 :(得分:4)
如果没有关键字var
,bar
将成为全局变量。你需要:
for (var bar in Foo) {
或者,
var bar;
for (bar in Foo) {
答案 1 :(得分:1)
他们都共享example
,因为他们都在一个函数中。
此外,未声明bar
,JavaScript将假定它为global
。
答案 2 :(得分:0)
不,bar未在函数范围内声明为局部变量。
但是还有更糟糕的事情:永远不要为数组使用for-in-loops!
var foo = [];
for (var i=0; i<foo.length; i++)
// do something with foo[i]
答案 3 :(得分:0)
只是为了扩展其他答案,有两种方法可以避免通过函数创建全局变量:
var
关键字,例如var foo
function myFunc(foo)