Я дам пример (в 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, который он знает, где найти, что значение выполняет дополнение.
Вы можете использовать метод JavaScript hasOwnProperty , чтобы добиться этого в цикле, например:
for(var key in arr) {
if (arr.hasOwnProperty(key)) {
...
}
}
Ссылка: Эта статья в блоге YUI .
Для высокопроизводительной итерации по массивам 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
) вместо другой переменной 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]);
вы могли бы сделать это:
for(var key in arr)
{
if (typeof(arr[key]) == "function")
continue;
alert(key);
}
Но это дрянной обходной путь