2013-03-16 2 views
0

здесь функция:Какова цель этой функции?

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

Я хотел бы понять:

  • конструкт "для (вар п в this.M)"; Я привык к регулярному циклу, и я не знаком с этой конструкцией.
  • как «this.M» вписывается в код, т. Е. Его назначение
  • вообще говоря, для чего эта функция, скорее всего, будет использоваться.

Благодаря

+1

Ссылка на ['for ... in'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in) loop –

+0

Я думаю, что вы «мы оставили некоторые важные части кода, вы должны сообщить нам, что это такое (например, какой объект« hasCompoenents »вызывается как метод). – RobG

+0

Либо это какой-то странный/плохой код, либо вы исключаете некоторые ключевые части. 'HasComepnents' кажется свойством объекта, но' M' является переменной. И 'M' является массивом, он будет включать перечисляемые унаследованные свойства * (что может быть точкой) *. –

ответ

1

Похоже, что есть недостающий код.

var M = []; 

Назначает новый массив переменной M, которая, кажется, глобальная переменная (но, вероятно, это не так, вы просто не показали достаточно кода, чтобы правильно определить контекст).

haveComponents: function() { 

Это, как представляется, быть частью литерала объекта, который присваивает функции к свойству называется haveComponents.

 var a = 0; 

Создает локальную переменную a и когда код выполняется, присваивает ему значение 0.

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

Создает локальную переменную n и последовательно присваивает ему имя перечислимого свойства любых this.M ссылок. Если является глобальным объектом, то M будет массивом, инициализированным выше. Если нет, это может быть или не быть чем-то другим. У вас не было другого задания, или у которого установлено значение this.

Для каждого перечислимого свойства M (который включает в себя его наследуемые свойства) a будет увеличиваться на единицу.

 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

+0

Просто с точки зрения не возврата изнутри цикла и наличия только одного оператора return. Тест 'hasOwnProperty' может быть лучше или нет, так как непонятно, какова точка исходной функции. Просто длина чтения может или не может выполнять эту работу. : -/ – RobG

+0

@RobG: вы правы в том, что это было частью литерала объекта. Я исправил свой первоначальный пост, поэтому теперь он более автономный. Что касается возврата a> 0; он фактически возвращает 1, который, как я думал, был вызван a ++ и что он работает только один раз, увеличивая его от 0 до 1 ... Я прав? – max7

0

В for(var n in this.M) перебирает все элементы this.M, последовательно сохраняя их в переменной n.

Я понятия не имею, что такое this.M, это зависит от того, откуда исходит ваш код.

В целом, я бы сказал, что этот код возвращает, является ли M пустым или нет (и возвращает true, если он не пуст).

+1

«это» - это глобальное пространство, вот как оно работает с массивом M. – QuentinUK

+1

Как это может быть? Там синтаксическая ошибка, если взять буквально (двоеточие), поэтому единственное допустимое предположение заключается в том, что функция привязана к некоторому объекту, и полный источник не раскрывается. В '{func: function() {return this.M;}}', 'this' не является глобальным пространством. – tjameson

+1

@tjameson Это была моя мысль. Не то, чтобы этот код на самом деле в целом имел такой смысл. Изменить: на самом деле, похоже, что вопрос был отредактирован, и двоеточие было удалено, поэтому, возможно, это глобальная область. – Xymostech

1
  • for(var n in this.M) это for-each цикл, используемый для перебора набора значений вместо того, что с помощью условий. Он используется для перебора свойств объектов.
  • this ключевое слово, обратитесь к владельцу функции (которой является функцией haveComponents), в то время как M является собственностью this
  • эта функция просто, бесцельно, подсчитывает элементы в M, чтобы увидеть, если они больше, чем 0. Однако подсчет их абсолютно лишний для этой цели.
+0

Как вы определяете «владельца» функции? Кроме того, как вы определяете «переменную экземпляра»? И почему вы называете это «абсолютно лишним»? –

+0

Что касается вашего первого и второго вопроса в JS, это немного сложно, я предлагаю вам прочитать эту статью: http://www.digital-web.com/articles/scope_in_javascript/. Что касается лишнего: потому что вам не нужно подсчитывать количество элементов внутри коллекции значений, чтобы знать, что оно не пустое, зная, что есть хотя бы один элемент, достаточно. – Jack

+0

Я уже знаю ответы. Мне было интересно, поняли ли вы это. У функций нет владельцев. Значение 'this' очень динамично и может относиться к некоторому объекту, полностью отделенному от функции. Термин «переменная экземпляра» не имеет большого смысла, поскольку объекты не имеют переменных. У них есть свойства.Код не лишний. Его целью может быть проверка наследуемых свойств на 'M', поэтому даже если' this.M' является пустым массивом, 'for-in' может найти свойства. –

1

Функция подсчитывает, сколько элементов в массиве M.

  • for in позволяет перебирать перечислимые свойства объекта, note that this is different from a for each behaviour где итерации над элементами, а тх свойство. В javascript это означает переход в имена свойств прототипа и их перечисление, что может привести к неожиданному результату.
+0

спасибо за разъяснение разницы между a для in и a для каждого цикла. Я узнал что-то новое! – max7

Смежные вопросы