这是一个javascript示例:
var obj =
{
options: [],
init: function( )
{
options['one'] = 'one';
for( k in options )
{
alert( options[k] );
}
}
};
而不是提示“一”,它说未定义,为什么?
答案 0 :(得分:3)
您需要将其引用为obj.options
。
除此之外,如果您不打算使用数字索引,则应使用对象{}
而不是数组[]
。
var obj =
{
options: {},
init: function( )
{
obj.options['one'] = 'one';
for( k in obj.options )
{
alert( obj.options[k] );
}
}
};
如果您从init()
引用中调用obj
函数,那么您可以在this
函数中使用init
而不是{{} 1}}。
obj
如@CMS所述,您应该使用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
声明变量。在var
循环中,for
未声明为k
,因此将成为全局变量。
答案 1 :(得分:0)
你在做什么看起来在形式和概念上与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)