Comments 18
Гиковато, но полезно. А замыкание оно и в Африке — замыкание. Версий лучше не нужно.
Нужный перевод, хороший материал, без воды, несмотря на то, что статья 2010 года.
По-моему, зря выкинули примеры кода.
Спасибо за публикацию.
По-моему, зря выкинули примеры кода.
Спасибо за публикацию.
Вы отлично перевели это статью! прочитал как будто главу в хорошей IT книге!
И да, статейку про замыкания тоже круто было бы почитать в Вашем переводе :)
И да, статейку про замыкания тоже круто было бы почитать в Вашем переводе :)
Более подробно о контекстах и замыканиях можно почитать у Дмитрия Сошникова: dmitrysoshnikov.com/ecmascript/ru-javascript-the-core/
Поранилась статья и перевод. Жду продолжения. Спасибо!
Спасибо за перевод, это, наверное, самые наглядные объяснения области видимости и как работает this
1. весьма странно говорить о scope vs global vs window, не обозначая что такое этот самый scope.
В примере с «локальными переменными» — откуда и чем определяется scope? границаим файла? браузером? жаваскрипт-движком? или предполагается что вокруг него где-то стоят { }?
2. Object.create — это не семантика языка, а семантика фичи распоследней версии ecmascript.
Семантика языка былабы через foo.__proto__ = protofoo
3. Свойство __proto__ на диаграммах не обозначено.
4. Ссылка на прототип обозначена также как и вложение scope.
5. теперь у вас есть и сущность [Scope] и свойство замыкания [scope] и отличная диаграмма Cloe the Closure Albert the Awesome на которой непонятно откуда и куда идут стрелочки.
Вы уверены, что ваша статья что-то проясняет для тех, кто не знаком с жаваскриптом?
Может быть, лучше отправить новичков на javascript.ru?
В примере с «локальными переменными» — откуда и чем определяется scope? границаим файла? браузером? жаваскрипт-движком? или предполагается что вокруг него где-то стоят { }?
2. Object.create — это не семантика языка, а семантика фичи распоследней версии ecmascript.
Семантика языка былабы через foo.__proto__ = protofoo
3. Свойство __proto__ на диаграммах не обозначено.
4. Ссылка на прототип обозначена также как и вложение scope.
5. теперь у вас есть и сущность [Scope] и свойство замыкания [scope] и отличная диаграмма Cloe the Closure Albert the Awesome на которой непонятно откуда и куда идут стрелочки.
Вы уверены, что ваша статья что-то проясняет для тех, кто не знаком с жаваскриптом?
Может быть, лучше отправить новичков на javascript.ru?
По пунктам 2,3 — прототип в стандарте обозначается как [Prototype] (видел вариант [[Prototype]]). __proto__ — это такая же семантика фичи, как и Object.create, да еще и нестандартная. Этого свойства на диаграмме нет, поскольку оно обозначено так же, как и вложение scope.
Также могу добавить пунктов.
6. Сущности [Object] и [Scope] указаны как принципиально разные, хотя это не так ([Scope] в некоторых движках может стать объектом при вызове функции без контекста, [Object] можно встроить в scope chain при помощи оператора with)
С учетом оператора with становится еще важнее пункт 4, поскольку в результате его использования текущий scope будет иметь и внешний scope, и прототип.
Также могу добавить пунктов.
6. Сущности [Object] и [Scope] указаны как принципиально разные, хотя это не так ([Scope] в некоторых движках может стать объектом при вызове функции без контекста, [Object] можно встроить в scope chain при помощи оператора with)
С учетом оператора with становится еще важнее пункт 4, поскольку в результате его использования текущий scope будет иметь и внешний scope, и прототип.
var name = "Tim Caswell"; var age = 28; var isProgrammer = true; // Забываем поставить var likesJavaScript = true;
Пример близок к истине, но ошибочный. true — это сокращённая запись выражения new Boolean(true)? т.е. берёт новый объект. Если хотя бы trueVar — то другое дело.
Вы не путаете с другими языками? Boolean это «костыльная» обертка, для приведения других типов к булевому. К тому же позволяющая всякие извращения:
Очевидно, что полезность объекта Boolean в реальной жизни стремится к нулю. Другими словами это мусорный объект в текущих реализациях.
var a = true;
var b = new Boolean(true);
if (a == b) {
console.log("a == b");
} // пока все ок
if (a === b) {
console.log("a === b");
} else {
console.log("Хм...");
}
if (new Boolean(true) == b) {
console.log("new Boolean(true) == b");
} else {
console.log("О как...");
}
if ((new Boolean(true)).valueOf() == (new Boolean(true)).valueOf()) {
console.log("Ну хоть как-то");
}
if(new Boolean(new Boolean(false)) == true) {
console.log("FML!");
}
Очевидно, что полезность объекта Boolean в реальной жизни стремится к нулю. Другими словами это мусорный объект в текущих реализациях.
еще могу дополнить:
if(new Boolean(false)) console.log('WTF?');
так что да, обьект Boolean бесполезный и приводит к путаницам. А функция Boolean вполне полезная для приведения чего-либо к булевому значению:if(Boolean('') && Boolean(0) && Boolean(-1)) console.log('no');
При чём тут конструктор Boolean? С его помощью подчеркнул, что true и true в программе — разные объекты, а не так, как утверждает автор (хотя true===true, т.к. константы). Как раз то, что Вы назвали «Хм...» и «О как». В последнем, кстати, пропустили "=" (надо "==="), чтобы убедиться, что не тру. А константа true и объект new Boolean(true) — это, конечно, разные вещи, потому что разные ссылки на объекты (тут выразительных средств джаваскрипта не хватает, чтобы пояснить на нём суть ошибки автора.
В примере выше мы проверили, указывают ли две ссылки на одно и то же значение, используя оператор === и получили подтверждение true.
OMG. Какая ересь!
OMG. Какая ересь!
Sign up to leave a comment.
JavaScript в диаграммах (Часть 1)