2012-02-17 79 views
1

爲什麼以下函數返回undefinedjavascript中的全局靜態函數

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向下移動一圈,在循環外。