2011-06-02 3 views
6

Какие инструменты могут использоваться для передачи понятий, таких как масштабирование и закрытие переменных JavaScript, что-то похожее на диаграммы последовательности UML? Например, как можно закодировать как следующее: (the Infamous Loop Problem)Диаграммы для функций JavaScript

var arr = []; 
for(var i=0; i<10; i++) { 
    arr.push(function() { alert(i); }); 
} 
for(var j=arr.length;j--;) { 
    arr[j](); 
} 

... быть четко объяснено в схеме, подобной этой:

A blank UML sequence diagram

+5

Этот код не делает то, что вы думаете. Каждое предупреждение будет предупреждать о последнем значении 'i'. Это классическая проблема «функция-в-петле». –

+0

Ваш пример предупредит «10» на каждой итерации. См. Http://stackoverflow.com/questions/5555464/javascript-closure-of-loop – lawnsea

+3

@lawnsea @Matt Ball - я использовал его именно по этой причине; потому что это классический пример. –

ответ

6

Код произвольное пример. Код не имеет ничего общего с вопросом, просто демонстрирует часто вводящий в заблуждение код, который может быть полезен при описании.

Вы не можете описать закрытие и область видимости в UML. В этом нет никакой поддержки, а не в диаграммах последовательностей. Закрытие в JavaScript немного напоминает определение класса в Java или C#, вы не ставите его в свой UML. Хмм, я не могу это объяснить очень хорошо.

Закрытие - это то, что вы должны понимать по сути как программист JavaScript.

В чем ваш UML должен быть сосредоточен на объектах и ​​их взаимодействии. Не какой-то язык «quirk» (если хотите), как необходимость закрытия.

Я все для описания вводящего в заблуждение кода, но UML-диаграмма не для этого. Поместите его в комментарии в исходном коде. Если кто-то хочет знать, как работает эта функция, он посмотрит на исходный код. Если он не хочет знать, не беспокойте его.

+1

Тем более, что вопрос требует «четко объяснить», это правильный ответ. Ты не можешь. Расширяя ваши UML-диаграммы с помощью пользовательской нотации, отличной от UML, вы можете их представлять. Но не так. – Kissaki

+0

+1 - «Нет» - это честный ответ ... но какие-либо мысли о передаче взаимодействия этих лиц? Даже в не-UML-формате? –

+0

Использовать диаграмму последовательности (UML)? Вот как вы описываете взаимодействие сущности. – Halcyon

0

Там в этот коммерческий продукт:

http://www.aivosto.com/visustin.html

Он генерирует блок-схемы (которые я видел) и диаграммы UML активности (которые я не - я только использовал гораздо более старую версию) ,

6

Мне нравятся диаграммы, которые Дмитрий Сошников использовал в JavaScript. The Core, чтобы объяснить контекст выполнения и сферы действия. В комментариях, он говорит, что они были сделаны в Visio (не то, что инструмент здесь важен, это концепции, с которыми помогают структуры).

Я вижу, как подобные диаграммы могут быть использованы для демонстрации того, как каждая функция, созданная в вашем примере кода, получает доступ к переменной i в той же области действия и как в фиксированной версии кода каждая функция будет переносить другой элемент в заголовке своей цепочки областей видимости, с переменной, удерживающей текущее значение i во время закрытия области содержимого.

+0

Это выглядит интересно. Я надеялся на что-то более последовательное, но это выглядит очень многообещающим. +1 –

0

Закрытие JavaScript anonymous objects. Представляя их в диаграммах последовательности сложно, но я считаю, что это можно сделать так:

JavaScript Closure UML

В этом случае основная сфера создает замыкания в петлю, а затем вызывает их. Закрытие анонимно и относится к общему классу «Закрытие».

В других случаях замыкание может быть создано, по имени, передается на другой объект, а затем вызывается из этого объекта:

enter image description here

+0

Закрытие не обязательно должно быть анонимным. Любая функция, возвращающая внутреннюю функцию (или объект со ссылкой на внутреннюю функцию), создаст закрытие – Ryan

2

Я знаю, что это уже ответил, но вот хороший пример используя диаграммы объектов для объяснения функций, затворов, объекты в JavaScript

https://howtonode.org/object-graphs

графики построены с текстовыми файлами (в нотации xxx.xxx.xxx.xxx), а затем генерируется автоматически с помощью Гра phViz

Автор, Тим Caswell, включил ссылки на исходные файлы на его GitHub счет

enter image description here