JavaScript: сокрытие опытных методов в для цикла?

Я дам пример (в JavaScript):

function makeCounter () {
  var count = 0;
  return function () {
    count += 1;
    return count;
  }
}

var x = makeCounter();

x(); returns 1

x(); returns 2

...etc...

то, Что делает эта функция, makeCounter, является ею, возвращает функцию, которую мы вызвали x, который подсчитает к одному каждому разу его названный. Так как мы не предоставляем параметров x, он должен так или иначе помнить количество. Это знает, где найти его на основе того, что назвало лексический обзор - это должно смотреть на пятно, где это определяется для нахождения значения. Это "скрытое" значение - то, что называют закрытием.

Вот мой приправляющий карри пример снова:

function add (a) {
  return function (b) {
    return a + b;
  }
}

var add3 = add(3);

add3(4); returns 7

то, Что Вы видите, - то, что, когда Вы звоните, добавляют с параметром (который равняется 3), что значение содержится в закрытии возвращенной функции, которую мы определяем, чтобы быть add3. Тот путь, когда мы называем add3, который он знает, где найти, что значение выполняет дополнение.

45
задан Nick Franceschina 10 July 2009 в 04:22
поделиться

4 ответа

Вы можете использовать метод JavaScript hasOwnProperty , чтобы добиться этого в цикле, например:

for(var key in arr) {
    if (arr.hasOwnProperty(key)) {
        ...
    }
}

Ссылка: Эта статья в блоге YUI .

49
ответ дан 26 November 2019 в 21:03
поделиться

Для высокопроизводительной итерации по массивам JavaScript используйте цикл for или while . Николас Закас обсуждает наиболее эффективные варианты перебора массивов в своем Tech Talk Speed ​​Up Your JavaScript .

Ваш лучший выбор, вероятно, будет примерно таким:

for (var i = collection.length - 1; i >= 0; i--) {
  if (obj == collection[i]) return true;
}

Этот подход будет наиболее эффективным для несколько причин:

  • Выделяется только одна локальная переменная
  • Свойство коллекции length доступно только один раз, при инициализации цикла
  • На каждой итерации локальная переменная сравнивается с константой ( i> = 0 ) вместо другой переменной
0
ответ дан 26 November 2019 в 21:03
поделиться

Javascript не поддерживает ассоциативные массивы так, как вы думаете. http://ajaxian.com/archives/javascript-associative-arrays-considered-harmful

for (var i in .. получает все свойства объекта (массив - это просто еще один объект), который почему вы видите другие объекты, прототипом которых вы являетесь.

Как говорится в статье, вам следует использовать объект:


var assoc = {'One' : 1, 'Two' : 2};
assoc['Three'] = 3;

for(var key in assoc)
   alert(key+' => '+assoc[key]);
4
ответ дан 26 November 2019 в 21:03
поделиться

вы могли бы сделать это:

for(var key in arr)
{
   if (typeof(arr[key]) == "function")
      continue;
   alert(key);
}

Но это дрянной обходной путь

2
ответ дан 26 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: