这里是功能:这个功能的目的是什么?
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