renovations

This commit is contained in:
Ilya Kantor 2015-04-01 19:08:41 +03:00
parent 0e9ceb2b3a
commit 150d92f10f
47 changed files with 290 additions and 110 deletions

View file

@ -5,3 +5,22 @@
При создании объекта `{ value: this }`, в свойство `value` копируется ссылка на текущий контекст, то есть на `user`.
Получается что `user.export().value == user`.
```js
//+ run
var name = "";
var user = {
name: "Василий",
export: function() {
return {
value: this
};
}
};
alert( user.export().value == user ); // true
```

View file

@ -34,5 +34,7 @@ ladder.showStep(); // 1
ladder.up().up().down().up().down().showStep(); // 1
```
Как видно, такая запись содержит "меньше букв" и может быть более наглядной.
Такой подход называется "чейнинг" (chaining) и используется, например, во фреймворке jQuery.

View file

@ -9,7 +9,7 @@
Основной метод для управления свойствами -- [Object.defineProperty](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty).
Он позволяет как просто объявить свойство объекта, так и настроить тонко настроить его особые аспекты, которые никак иначе не изменить.
Он позволяет как просто объявить свойство объекта, так и тонко настроить его особые аспекты, которые никак иначе не изменить.
Синтаксис:

View file

@ -13,7 +13,7 @@ f(); // Вася
Первый вызов `f.bind(..Вася..)` возвращает "обёртку", которая устанавливает контекст для `f` и передаёт вызов `f`.
Следующий вызов `bind` будет устанавливать контекст уже для этой обёртки, это ни на что не влияет.
Следующий вызов `bind` будет устанавливать контекст уже для этой обёртки. Это ни на что не повлияет.
Чтобы это проще понять, используем наш собственный вариант `bind` вместо встроенного:
@ -45,12 +45,14 @@ f(); // Вася
function bind(func, context) {
*!*
return function() {
// здесь this не используется
return func.apply(context, arguments);
};
*/!*
}
```
В этой обёртке нигде не используется `this`, только `func` и `context`. Посмотрите на код, там нигде нет `this`.
В этой обёртке нигде не используется `this`, контекст `context` берётся из замыкания. Посмотрите на код, там нигде нет `this`.
Поэтому следующий `bind` в строке `(2)`, который выполняется уже над обёрткой и фиксирует в ней `this`, ни на что не влияет. Какая разница, что будет в качестве `this` в функции, которая этот `this` не использует? Контекст `context`, как видно в коде выше, она получает через замыкание из аргументов первого `bind`.
Поэтому следующий `bind` в строке `(2)`, который выполняется уже над обёрткой и фиксирует в ней `this`, ни на что не влияет. Какая разница, что будет в качестве `this` в функции, которая этот `this` не использует?

View file

@ -12,7 +12,7 @@
В браузере есть встроенная функция `setTimeout(func, ms)`, которая вызывает выполение функции `func` через `ms` миллисекунд (=1/1000 секунды).
Мы подробно остановимся на ней и её тонкостях позже, в главе [](/setTimeout-setInterval), а пока просто посмотрим пример.
Мы подробно остановимся на ней и её тонкостях позже, в главе [](/settimeout-setinterval), а пока просто посмотрим пример.
Этот код выведет "Привет" через 1000мс, то есть 1 секунду:

View file

@ -53,7 +53,7 @@ alert( timers.myFunc ); // общее время выполнения всех
```js
//+ run
var timers = {}
var timers = {};
// прибавит время выполнения f к таймеру timers[timer]
function timingDecorator(f, timer) {
@ -114,7 +114,7 @@ function sum(a, b) {
alert( sum(true, { name: "Вася", age: 35 }) ); // true[Object object]
```
Функция "как-то" отработала, но в реальной жизни такой вызов, скорее всего, будет следствием программной ошибки. Всё-таки `sum` предназначена для суммирования чисел, а не объектов.
Функция "как-то" отработала, но в реальной жизни передача в `sum` подобных значений, скорее всего, будет следствием программной ошибки. Всё-таки `sum` предназначена для суммирования чисел, а не объектов.
Многие языки программирования позволяют прямо в объявлении функции указать, какие типы данных имеют параметры. И это удобно, поскольку повышает надёжность кода.