Pull to refresh

Comments 18

Гиковато, но полезно. А замыкание оно и в Африке — замыкание. Версий лучше не нужно.
Нужный перевод, хороший материал, без воды, несмотря на то, что статья 2010 года.
По-моему, зря выкинули примеры кода.

Спасибо за публикацию.
Вы отлично перевели это статью! прочитал как будто главу в хорошей IT книге!
И да, статейку про замыкания тоже круто было бы почитать в Вашем переводе :)
Лучший материал на русском, который я видел. Особенно цикл статей «Тонкости ECMA-262-3»
UFO landed and left these words here
Спасибо за перевод, это, наверное, самые наглядные объяснения области видимости и как работает 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?
По пунктам 2,3 — прототип в стандарте обозначается как [Prototype] (видел вариант [[Prototype]]). __proto__ — это такая же семантика фичи, как и Object.create, да еще и нестандартная. Этого свойства на диаграмме нет, поскольку оно обозначено так же, как и вложение 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 это «костыльная» обертка, для приведения других типов к булевому. К тому же позволяющая всякие извращения:

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. Какая ересь!
Sign up to leave a comment.

Articles