renovations
This commit is contained in:
parent
0e9ceb2b3a
commit
150d92f10f
47 changed files with 290 additions and 110 deletions
|
@ -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
|
||||
```
|
|
@ -34,5 +34,7 @@ ladder.showStep(); // 1
|
|||
ladder.up().up().down().up().down().showStep(); // 1
|
||||
```
|
||||
|
||||
Как видно, такая запись содержит "меньше букв" и может быть более наглядной.
|
||||
|
||||
Такой подход называется "чейнинг" (chaining) и используется, например, во фреймворке jQuery.
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
Основной метод для управления свойствами -- [Object.defineProperty](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty).
|
||||
|
||||
Он позволяет как просто объявить свойство объекта, так и настроить тонко настроить его особые аспекты, которые никак иначе не изменить.
|
||||
Он позволяет как просто объявить свойство объекта, так и тонко настроить его особые аспекты, которые никак иначе не изменить.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
|
|
|
@ -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` не использует?
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
В браузере есть встроенная функция `setTimeout(func, ms)`, которая вызывает выполение функции `func` через `ms` миллисекунд (=1/1000 секунды).
|
||||
|
||||
Мы подробно остановимся на ней и её тонкостях позже, в главе [](/setTimeout-setInterval), а пока просто посмотрим пример.
|
||||
Мы подробно остановимся на ней и её тонкостях позже, в главе [](/settimeout-setinterval), а пока просто посмотрим пример.
|
||||
|
||||
Этот код выведет "Привет" через 1000мс, то есть 1 секунду:
|
||||
|
||||
|
|
|
@ -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` предназначена для суммирования чисел, а не объектов.
|
||||
|
||||
Многие языки программирования позволяют прямо в объявлении функции указать, какие типы данных имеют параметры. И это удобно, поскольку повышает надёжность кода.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue