开发者问题收集

为什么说数组未定义?

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