2013-03-16 180 views
0

這裏是功能:這個功能的目的是什麼?

var M = []; 
function haveComponents() { 
     var a = 0; 
     for (var n in this.M) a++; 
     return a > 0; 
    } 

我想明白了:

  • 「爲(在this.M變種N)」 的結構;我習慣於循環,我不熟悉這個構造。
  • 「this.M」如何適合代碼,即其目的
  • 一般來說,這個函數可能用於什麼。

由於

+1

引用['for ... in'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in)loop – 2013-03-16 01:11:07

+0

我想你我們忽略了代碼中的一些重要部分,您需要讓我們知道「this」是什麼(例如,什麼對象是被稱爲「hasCompoenents」的方法)。 – RobG 2013-03-16 01:11:36

+0

這是一些奇怪/不好的代碼,或者你排除了一些關鍵部分。 'haveComepnents'似乎是一個對象的屬性,但'M'是一個變量。而'M'是一個數組,它將包含可枚舉的繼承屬性*(可能是點)*。 – 2013-03-16 01:12:38

回答

1

似乎有一些遺漏的代碼。

var M = []; 

分配一個新的數組變量M,這似乎是一個全局變量(但有可能不是,你只是沒有顯示出足夠的代碼,以確定正確的上下文中)。

haveComponents: function() { 
這似乎

是指派給被叫haveComponents屬性的功能的對象文本的一部分。

 var a = 0; 

創建本地變量a和代碼執行時,爲其分配的0的值。

 for (var n in this.M) a++; 

創建一個局部變量n和順序給它分配任何this.M引用的枚舉屬性的名稱。如果this是全局對象,則M將是上面初始化的數組。如果沒有,它可能會或可能不是別的。您尚未顯示任何其他任務,或者已設置爲this

對於M(包括它的繼承屬性)的每個可枚舉的屬性,a將增加1。

 return a > 0; 
    } 

返回true如果a大於零。

的等效功能是:

haveComponents: function() { 

    for (var n in this.M) { 

     // this.M has at least one enumerable property 
     return true; 
    } 

    // this.M has no enumerable properties 
    return false; 
} 

或用於純化論:

haveComponents: function() { 
    var hasEnumerable = false; 
    for (var n in this.M) { 
     hasEnumerable = true; 
     break; 
    } 
    return hasEnumerable; 
} 
+0

你最後一個例子更「純」嗎?假設'this.M'是一個數組,並且沒有被其他垃圾擴展,'this.M.length> 0'更「純」。 – tjameson 2013-03-16 01:27:29

+0

只是不從循環內部返回而只有一個返回語句。 'hasOwnProperty'測試可能會更好或不好,因爲它不清楚原始函數的重點。簡單閱讀篇幅可能會或可能不會完成這項工作。 : -/ – RobG 2013-03-16 01:31:36

+0

@RobG:你是對的,因爲它是對象文字的一部分。我糾正了我原來的帖子,所以現在更多的是一個獨立的功能。對於返回a> 0;它實際上返回1,我認爲是由於a ++,並且它只運行一次從0增加到1 ...我是否正確? – max7 2013-03-16 01:46:09

0

for(var n in this.M)遍歷所有的this.M元件,依次將它們存儲在變量n

我不知道this.M是什麼,這取決於你的代碼來自哪裏。

一般而言,我會說這個代碼返回M是否爲空(如果它不爲空,則返回true)。

+1

「this」是全局空間,這就是它如何與數組M一起工作。 – QuentinUK 2013-03-16 01:20:20

+1

它是怎麼回事?如果從字面上理解(冒號),則會出現語法錯誤,所以唯一有效的假設是該函數附加到某個對象,並且未披露全部源。在'{func:function(){return this.M;}}'中,'this'不是全局空間。 – tjameson 2013-03-16 01:36:36

+1

@tjameson這也是我的想法。並不是說這個代碼真的讓整體感覺很好。編輯:實際上,它看起來像編輯了問題,冒號被刪除,所以也許它是全球範圍。 – Xymostech 2013-03-16 02:15:44

1
  • for(var n in this.M)這是一個循環for-each,用於迭代的一組值,而不是通過使用條件的。它用於迭代對象的屬性。
  • this關鍵字參見功能(其是haveComponents函數)的所有者,而Mthis
  • 屬性此功能只,無用地,計算在M元素,看看它們是否大於0。但是,計算它們對於此目的而言絕對是多餘的。
+0

如何定義函數的「所有者」?另外,你如何定義「實例變量」?爲什麼你稱這爲「絕對多餘」? – 2013-03-16 01:16:04

+0

關於你在JS中的第一個和第二個問題,這有點棘手,我建議你閱讀這篇文章:http://www.digital-web.com/articles/scope_in_javascript/。關於是多餘的:因爲你不需要計算一組值中的元素的數量以知道它不是空的,知道至少有一個元素足夠。 – Jack 2013-03-16 01:19:22

+0

我已經知道答案。我想知道你是否明白這一點。職能沒有所有者。 'this'值非常動態,可以引用一些完全脫離函數的對象。術語「實例變量」沒有多大意義,因爲對象沒有變量。他們有屬性。代碼不是多餘的。它的目的可能是檢查'M'上的繼承屬性,所以即使'this.M'是一個空數組,'for-in'也可以找到屬性。 – 2013-03-16 01:23:04

1

功能計數的許多元素是如何的M個陣列英寸

+0

感謝您澄清for for和for each loop之間的區別。我學到了新東西! – max7 2013-03-16 01:48:38