Pull to refresh
10
0
Кулешов Александр @lx_kov

User

Send message
Кстати, Корнфорд считается одним из создателей паттерна модуль, а Крокфорд о нем лучше рассказал ;)

Learning JavaScript Design Patterns
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.

Насчет in-line выполнения, не смог придумать, как лучше перевести. Имеется в виду самовызывающаяся функция.
Рад, что это вам оказалось полезно. Вот еще пример из stackoverflow

setTimeout(function() {
    postinsql(topicId);
}, 4000)

То же самое, что и в посте, но в другом формате.
Для использования setTimeout нужно вызвать эту функцию и передать ссылку на объект функции в качестве первого аргумента и интервал в миллисекундах — в качестве второго, но ссылка на объект функции не может содержать параметры для запланированного выполнения этой функции.

Теперь setTimeout поддерживает параметры выполняемой функции в виде дополнительных (необязательных) параметров (в IE начиная с 10 версии).
+
JavaScript Enlightenment
By Cody Lindley
Нагуглил список книг, ссылающихся на эту статью, просто оставлю его здесь.

Список
JavaScript by Example
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
Точно не знаю как это реализовано, но описывают так: объект функции создается либо во время процесса создания переменных (variable instantiation), если это декларация функции. Либо во время выполнении операции присваивания (могут быть другие операции, например выполнение оператора группировки) т.е. на этапе интерпретации, если это функция-выражение (Function Expression). Когда вызывается внешняя функция, то в стек добавляется контекст исполнения, содержащий объект активации (Activation object AO). Этот AO содержит все формальные параметры, локальные переменные и ссылки на объекты функций, но только те, которые были созданы декларацией (они не могут быть без имени). А вот объекты функции созданные выражением (могут быть именованными, но почти не отличаются от анонимных) не засоряют AO (только если не присвоены локальной переменной).
Т.е. получается в случае деклараций функция, в контексте исполнения используются ссылки на уже созданные объекты. Насчет кэширования функций-выражений ничего не знаю.

Ответ на сообщение groaner.
Верно, я ступил, извиняюсь. __proto__ это свойство доступа (геттер, сеттер), изменяющее внутренне свойство [[Prototype]], а не переименованное [[Prototype]], как я решил.
Недавно даже книга появилась, которая называется You Don't Know JS: Scope & Closures, а скоро выйдет Objects & Prototypes той же серии. Видимо тема не скоро устареет. И я на несколько часов раньше вас опубликовал статью 2004го года Замыкания в Javascript [Часть 1], правда ее гораздо труднее читать.
<ЗанудаМод>
(Стоит упомянуть что браузеры сохраняют ссылку на прототип в свойстве __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...

</ЗанудаМод>
Определение из MDN
Closures are functions that refer to independent (free) variables.

Определение из w3schools
A JavaScript closure is a function having access to the scope the parent function, after the parent function has returned.

The Definitive Guide
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.


Подробности см. в ECMA-262-3 10.1.4 и 13.2
Если честно, я не знаю функционального программирования, но думаю что такое определение дано для того, чтобы лучше описать реализацию замыканий именно в javascript. В данной статье (и спецификации ecmascript) подробно описан этот процесс. Функция это объект (возможно это вас тоже запутает), который имеет свойство [[scope]]. Оно ссылается на цепь областей видимости и создается во время создания объекта функции. Если данная информацию усложняет вам понимание javascript, то не советую читать данную статью (что вы естественно не делали) и тем более спецификацию.
В определении замыкание — это функция вместе со средой. У Сошникова почти так же
Замыкание (Closure) или более полно — лексическое замыкание (Lexical closure) — это совокупность блока кода и данных того контекста, в котором этот блок порождён.

var a = 20;
function testFn() {
  alert(a); // свободная переменная "а" == 20
}

// Замыкание для testFn
closureForTestFn = {
  call: testFn // сама функция
  lexicalContext: {a: 20} // контекст для поиска свободных переменных
};
dmitrysoshnikov.com/ecmascript/ru-chapter-6-closures/
Тема, по сути, избита; существует немалое количество статей, посвящённых этой структуре (некоторые из них очень хорошие, например, статья R. Cornford-a, представленная в списке дополнительной литературы), однако мы постараемся разобрать её более с теоретической точки зрения, и посмотрим, как замыкания в ECMAScript устроены изнутри.

Статьи Сошникова конечно проще читать и возможно даже полезнее, но на данную статью довольно часто ссылаются в том числе и сам Сошников поэтому решил перевести.

Information

Rating
Does not participate
Location
Орел, Орловская обл., Россия
Date of birth
Registered
Activity