为什么说数组未定义?
2011-01-12
261
这是一个 javascript 示例:
var obj =
{
options: [],
init: function( )
{
options['one'] = 'one';
for( k in options )
{
alert( options[k] );
}
}
};
它没有提示“one”,而是提示未定义,为什么?
2个回答
您需要将其引用为
obj.options
。
除此之外,如果您不打算使用数字索引,则应使用对象
{} 而不是数组
[]
。
var obj =
{
options: {},
init: function( )
{
obj.options['one'] = 'one';
for( k in obj.options )
{
alert( obj.options[k] );
}
}
};
如果
从
obj
引用调用
init()
函数,则可以在
init
函数内使用
this
,而不是
obj
。
var obj =
{
options: {},
init: function( )
{
this.options['one'] = 'one';
for( k in this.options )
{
alert( this.options[k] );
}
}
};
obj.init(); // Makes `this` refer to `obj` in the `init` function
正如
@CMS
所述,您应该使用
var
声明变量。在您的
for
循环中,
k
没有使用
var
声明,因此将成为全局变量。
user113716
2011-01-12
您所做的在形式和概念上与 javascript 中所谓的“模块模式”非常相似。 它是一种非常强大的工具,如果您想学习,我强烈建议您阅读它。
这是您的代码,重写为一个模块,并进行了更改以避免污染全局范围,并修复了
for in
循环中的潜在问题。
它还将
options
定义为对象,而不是数组,因为您似乎将其用作哈希表而不是数字索引。
var module = (function() {
//here options is private
var options = {};
var init = function() {
options['one'] = 'one';
for (var k in options) {
if(options.hasOwnProperty(k)){
alert(options[k]);
}
}
};
//These are the things that are public
return {
init:init
};
}());
module.init();
alert(module.options); //undefined (because it's private)
david
2011-01-12