2013-03-16 174 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