怎么说阵列未定义?

时间:2011-01-12 04:01:59

标签: javascript

这是一个javascript示例:

var obj =
{
   options:  [],

   init:  function( )
   {
       options['one'] = 'one';
       for( k in options )
       {
          alert( options[k] );
       }
   }
};

而不是提示“一”,它说未定义,为什么?

2 个答案:

答案 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)