這裏是功能:這個功能的目的是什麼?
var M = [];
function haveComponents() {
var a = 0;
for (var n in this.M) a++;
return a > 0;
}
我想明白了:
- 「爲(在this.M變種N)」 的結構;我習慣於循環,我不熟悉這個構造。
- 「this.M」如何適合代碼,即其目的
- 一般來說,這個函數可能用於什麼。
由於
這裏是功能:這個功能的目的是什麼?
var M = [];
function haveComponents() {
var a = 0;
for (var n in this.M) a++;
return a > 0;
}
我想明白了:
由於
似乎有一些遺漏的代碼。
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;
}
你最後一個例子更「純」嗎?假設'this.M'是一個數組,並且沒有被其他垃圾擴展,'this.M.length> 0'更「純」。 – tjameson 2013-03-16 01:27:29
只是不從循環內部返回而只有一個返回語句。 'hasOwnProperty'測試可能會更好或不好,因爲它不清楚原始函數的重點。簡單閱讀篇幅可能會或可能不會完成這項工作。 : -/ – RobG 2013-03-16 01:31:36
@RobG:你是對的,因爲它是對象文字的一部分。我糾正了我原來的帖子,所以現在更多的是一個獨立的功能。對於返回a> 0;它實際上返回1,我認爲是由於a ++,並且它只運行一次從0增加到1 ...我是否正確? – max7 2013-03-16 01:46:09
的for(var n in this.M)
遍歷所有的this.M
元件,依次將它們存儲在變量n
。
我不知道this.M
是什麼,這取決於你的代碼來自哪裏。
一般而言,我會說這個代碼返回M
是否爲空(如果它不爲空,則返回true
)。
「this」是全局空間,這就是它如何與數組M一起工作。 – QuentinUK 2013-03-16 01:20:20
它是怎麼回事?如果從字面上理解(冒號),則會出現語法錯誤,所以唯一有效的假設是該函數附加到某個對象,並且未披露全部源。在'{func:function(){return this.M;}}'中,'this'不是全局空間。 – tjameson 2013-03-16 01:36:36
@tjameson這也是我的想法。並不是說這個代碼真的讓整體感覺很好。編輯:實際上,它看起來像編輯了問題,冒號被刪除,所以也許它是全球範圍。 – Xymostech 2013-03-16 02:15:44
for(var n in this.M)
這是一個循環for-each,用於迭代的一組值,而不是通過使用條件的。它用於迭代對象的屬性。this
關鍵字參見功能(其是haveComponents
函數)的所有者,而M
是this
M
元素,看看它們是否大於0。但是,計算它們對於此目的而言絕對是多餘的。如何定義函數的「所有者」?另外,你如何定義「實例變量」?爲什麼你稱這爲「絕對多餘」? – 2013-03-16 01:16:04
關於你在JS中的第一個和第二個問題,這有點棘手,我建議你閱讀這篇文章:http://www.digital-web.com/articles/scope_in_javascript/。關於是多餘的:因爲你不需要計算一組值中的元素的數量以知道它不是空的,知道至少有一個元素足夠。 – Jack 2013-03-16 01:19:22
我已經知道答案。我想知道你是否明白這一點。職能沒有所有者。 'this'值非常動態,可以引用一些完全脫離函數的對象。術語「實例變量」沒有多大意義,因爲對象沒有變量。他們有屬性。代碼不是多餘的。它的目的可能是檢查'M'上的繼承屬性,所以即使'this.M'是一個空數組,'for-in'也可以找到屬性。 – 2013-03-16 01:23:04
功能計數的許多元素是如何的M個陣列英寸
for in
允許您迭代對象的枚舉的屬性,note that this is different from a for each
behaviour在迭代結束項目,而塔的屬性。在JavaScript中,這轉換成了原型屬性名稱並列出它們,可能會導致意想不到的結果。感謝您澄清for for和for each loop之間的區別。我學到了新東西! – max7 2013-03-16 01:48:38
引用['for ... in'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in)loop – 2013-03-16 01:11:07
我想你我們忽略了代碼中的一些重要部分,您需要讓我們知道「this」是什麼(例如,什麼對象是被稱爲「hasCompoenents」的方法)。 – RobG 2013-03-16 01:11:36
這是一些奇怪/不好的代碼,或者你排除了一些關鍵部分。 'haveComepnents'似乎是一個對象的屬性,但'M'是一個變量。而'M'是一個數組,它將包含可枚舉的繼承屬性*(可能是點)*。 – 2013-03-16 01:12:38