我写了一个类似下面的javascript:
<script language="javascript" type="text/javascript">
var name = new Array();
var i = 0;
function doSomething() {
name[i] = "a";
alert(name[i]);
i++;
}
</script>
它在我的Chrome中提醒undefined
而不是a
。我尝试alert(i)
,但效果很好。
如何为函数内的全局数组赋值?
问题解决了:我刚刚重命名了数组,它运行了!但为什么呢?
答案 0 :(得分:5)
name
is a property of the window
object:
获取/设置窗口的名称。
不要忘记全局变量也是全局对象(window
)的属性。现在,似乎Firefox允许您覆盖此属性,但Chrome不会。试试Chrome控制台:
> name = [];
[]
> typeof name
"string"
输出应为"object"
。
结论:不要使用名为name
的全局变量。如果您重命名变量,则It works perfectly。
答案 1 :(得分:0)
答案 2 :(得分:0)
这可能是因为吊装
您可能认为变量和函数的定义顺序与脚本中出现的顺序相同,但事实并非如此。 Here is a good article on hoisting。
当javascript解释器解析您的脚本时,它会将所有变量移动到范围的顶部。这也发生在函数声明中。我认为在你的案例中发生的事情是函数声明已经悬挂在变量之上,因此它们在其范围内不可用。此行为可能因浏览器而异。您可以使用函数表达式来修复它。
var name = new Array();
var i = 0;
var doSomething = function() {
name[i] = "a";
alert(name[i]);
i++;
}
doSomething(); // alerts 'a'
修改强>
我刚刚在Chrome中测试了这个答案,但它不起作用。 菲利克斯的答案很好