2012-02-17 15 views
1

次の結果がundefinedになるのはなぜですか?JavaScriptのグローバル静的関数

var global_vars = 
{ 

    countNumOfProperties : 
     function (obj) 
     { 
      var count = 0; 
      for (var k in obj) { 
       if (obj.hasOwnProperty(k)) { 
        ++count; 
       } 
       return count; 
      } 
     }  
}; 


var DS = 
{ 
    file_types_lookup : {} 
}; 


global_vars.countNumOfProperties(DS.file_types_lookup) 

答えて

1

return文はループの内側そうに達することはありませんです。

 for (var k in obj) { 
      if (obj.hasOwnProperty(k)) { 
       ++count; 
      } 
      return count; 
     } 

は、おそらくそのように

 for (var k in obj) { 
      if (obj.hasOwnProperty(k)) { 
       ++count; 
      } 
     } 
     return count; 

あるべき合計が返される前に、各プロパティがチェックされます。書かれたよう

、関数は自身のプロパティが存在しないが、列挙継承されたプロパティが存在することを示すために、最初の列挙プロパティが自身の財産であることを示すために

  • 1を返す、または
  • 0であろう、または
  • undefinedであり、列挙可能なプロパティがないことを示しますownまたはそれ以外。
2

オブジェクトには独自のプロパティを持っていないので、forループが実行されている何の反復を持っていない、と何return文が実行されませんますので。

私はあなたが}を置き忘れ推測:

var count = 0; 
for (var k in obj) { 
    if (obj.hasOwnProperty(k)) { 
     ++count; 
    } 
} 
return count; 
1

return count;ステートメントは、forループの外にある必要があります。

1

あなたはそれをは性質を持っているというオブジェクトを渡すときに何が起こるかを確認します

> global_vars.countNumOfProperties({foo: 1}) 
1 
> global_vars.countNumOfProperties({foo: 1, bar: 2}) 
1 
> global_vars.countNumOfProperties({foo: 1, bar: 2, baz: 3}) 
1 

問題はあなたがループ内return文を置くことです。ループ本体が最初に実行されたときに実行され、1を返してループを終了します。ただし、ループボディが実行されない場合(プロパティがないため)、実行されることはなく、関数はデフォルト値のundefinedを返します。

returnをループ外に1行下に移動するだけで済みます。

関連する問題