2011-04-07 75 views
3

内的全局数组我写了一个javascript像以下:值分配给一个函数

<script language="javascript" type="text/javascript"> 
    var name = new Array(); 
    var i = 0; 
    function doSomething() { 
     name[i] = "a"; 
     alert(name[i]); 
     i++; 
    }   
</script> 

它在我的铬惊动了undefined而不是a的。我试图alert(i),它工作得很好。

如何将值赋给函数内的全局数组?


问题解决:我刚刚重命名了数组,它工作!但为什么?

+0

好吧,不在我的 – 2011-04-07 07:32:11

+0

它在我的铬合金中工作; – Headshota 2011-04-07 07:35:00

+0

@Headshota someting is fishy http://jsfiddle.net/5G4Tx/ – 2011-04-07 07:36:25

回答

5

name is a property of the window object

获取/设置窗口的名称。

不要忘记全局变量也是全局对象(window)的属性。现在,看起来Firefox可以让你覆盖这个属性,但是Chrome并没有。尝试在Chrome的控制台:

> name = []; 
[] 
> typeof name 
"string" 

输出应该"object"

结论:请勿使用名为name的全局变量。 It works perfectly如果你重命名你的变量。

0

您正在提醒名称[i]不在函数中;但我已经1,因为你已经增加了它的功能。

所以alert(name[0]);

http://jsfiddle.net/5G4Tx/2/

+0

索引在* alert后增加*。这仍然会在Chrome中产生两个“未定义”。 – 2011-04-07 07:48:12

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这个答案,这是行不通的。 Felix的回答是不错的

+0

这不是吊装问题。 – 2011-04-07 07:47:12

+0

@Felix Kling是的,我认为你的回答是正确的 – meouw 2011-04-07 07:49:01

+0

只有当变量在函数范围内声明为低时才会出现提升。 – herostwist 2011-04-07 08:17:15

相关问题