From a historical perspective, the Module pattern was originally developed by a number of people including Richard Cornford in 2003. It was later popularized by Douglas Crockford in his lectures.
Для использования setTimeout нужно вызвать эту функцию и передать ссылку на объект функции в качестве первого аргумента и интервал в миллисекундах — в качестве второго, но ссылка на объект функции не может содержать параметры для запланированного выполнения этой функции.
Теперь setTimeout поддерживает параметры выполняемой функции в виде дополнительных (необязательных) параметров (в IE начиная с 10 версии).
Точно не знаю как это реализовано, но описывают так: объект функции создается либо во время процесса создания переменных (variable instantiation), если это декларация функции. Либо во время выполнении операции присваивания (могут быть другие операции, например выполнение оператора группировки) т.е. на этапе интерпретации, если это функция-выражение (Function Expression). Когда вызывается внешняя функция, то в стек добавляется контекст исполнения, содержащий объект активации (Activation object AO). Этот AO содержит все формальные параметры, локальные переменные и ссылки на объекты функций, но только те, которые были созданы декларацией (они не могут быть без имени). А вот объекты функции созданные выражением (могут быть именованными, но почти не отличаются от анонимных) не засоряют AO (только если не присвоены локальной переменной).
Т.е. получается в случае деклараций функция, в контексте исполнения используются ссылки на уже созданные объекты. Насчет кэширования функций-выражений ничего не знаю.
Верно, я ступил, извиняюсь. __proto__ это свойство доступа (геттер, сеттер), изменяющее внутренне свойство [[Prototype]], а не переименованное [[Prototype]], как я решил.
(Стоит упомянуть что браузеры сохраняют ссылку на прототип в свойстве __proto__, но его использование очень портит карму, как минимум потому что его нет в стандарте ECMAScript, так что не надо его использовать).
В спецификации это свойство называется [[Prototype]].
All objects have an internal property called [[Prototype]]. The value of this property is either null or an object and is used for implementing inheritance. Whether or not a native object can have a host object as its [[Prototype]] depends on the implementation...
This combination of a function object and a scope (a set of variable bindings) in which the function’s variables are resolved is called a closure in the computer science literature.
Если честно, я не знаю функционального программирования, но думаю что такое определение дано для того, чтобы лучше описать реализацию замыканий именно в javascript. В данной статье (и спецификации ecmascript) подробно описан этот процесс. Функция это объект (возможно это вас тоже запутает), который имеет свойство [[scope]]. Оно ссылается на цепь областей видимости и создается во время создания объекта функции. Если данная информацию усложняет вам понимание javascript, то не советую читать данную статью (что вы естественно не делали) и тем более спецификацию.
В определении замыкание — это функция вместе со средой. У Сошникова почти так же
Замыкание (Closure) или более полно — лексическое замыкание (Lexical closure) — это совокупность блока кода и данных того контекста, в котором этот блок порождён.
var a = 20;
function testFn() {
alert(a); // свободная переменная "а" == 20
}
// Замыкание для testFn
closureForTestFn = {
call: testFn // сама функция
lexicalContext: {a: 20} // контекст для поиска свободных переменных
};
Тема, по сути, избита; существует немалое количество статей, посвящённых этой структуре (некоторые из них очень хорошие, например, статья R. Cornford-a, представленная в списке дополнительной литературы), однако мы постараемся разобрать её более с теоретической точки зрения, и посмотрим, как замыкания в ECMAScript устроены изнутри.
Статьи Сошникова конечно проще читать и возможно даже полезнее, но на данную статью довольно часто ссылаются в том числе и сам Сошников поэтому решил перевести.
Learning JavaScript Design Patterns
То же самое, что и в посте, но в другом формате.
Теперь setTimeout поддерживает параметры выполняемой функции в виде дополнительных (необязательных) параметров (в IE начиная с 10 версии).
JavaScript Enlightenment
By Cody Lindley
By Ellie Quigley
JavaScript Cookbook
By Shelley Powers
Beginning Ajax
By Chris Ullman, Lucinda Dykes
Learning JavaScript: Add Sparkle and Life to Your Web Pages
By Shelley Powers
Advanced ASP.NET AJAX Server Controls For .NET Framework 3.5
By Adam Calderon, Joel Rumerman
Pro JavaScript Techniques
By John Resig
Ajax Design Patterns
By Michael Mahemoff
AJAX and PHP: Building Modern Web Applications
By Bogdan Brinzarea, Audra Hendrix
Ajax in Action
By Dave Crane, Eric Pascarello
Microsoft Ajax Library Essentials: Client-side ASP. NET Ajax 1. 0 Explained
By Bogdan Brinzarea
Т.е. получается в случае деклараций функция, в контексте исполнения используются ссылки на уже созданные объекты. Насчет кэширования функций-выражений ничего не знаю.
Ответ на сообщение groaner.
В спецификации это свойство называется [[Prototype]].
</ЗанудаМод>
Определение из w3schools
The Definitive Guide
Подробности см. в ECMA-262-3 10.1.4 и 13.2
Статьи Сошникова конечно проще читать и возможно даже полезнее, но на данную статью довольно часто ссылаются в том числе и сам Сошников поэтому решил перевести.