Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
UserAndLINUX_MoreThanUSER_v14.05(09).pdf
Скачиваний:
15
Добавлен:
18.02.2016
Размер:
9.89 Mб
Скачать

programming

Раскрытие тайны this в JavaScript

В этой статье мы попытаемся пролить свет на использование this в JavaScript и привнести немного ясности и понимание о том, как this работает. Это знание не относится к черной магии и не является запретным, наоборот – понимание механизма работы this чрезвычайно полезно для всех JavaScript-разработчиков.

Пока вы до конца не осознаете this, вы скорее всего будете чувствовать себя неуверенно.

Как это работает

Если метод был вызван из объекта, тогда this в контексте метода является ссылкой на родительский объект.

var parent = {

method: function () { console.log(this);

}

};

parent.method(); // ссылается на родительский объект

Заметьте, что этот паттерн очень уязвим, так как при вызове метода по ссылке this не будет больше ссылаться на родительский объект parent. Вместо этого, this теперь будет ссылаться на глобальный объект Window. Это обстоятельство приводит в замешательство большинство разработчиков.

var parentless = parent.method;

parentless(); // ссылается на Window

Впоследней строчке примера вы должны обратить внимание на то, как именно вызывается функция - возможны два варианта. Либо функция вызывается как свойство объекта, либо она сама по себе.

Иесли она вызывается как свойство, то this будет ссылаться на данное свойство, в противном случае – на глобальный объект. В данном примере это - Window, но в строгом режиме this будет возвращать undefined.

Вслучае с конструктором this ссылается на созданный экземпляр при условии использования ключевого слова new.

function ThisClownCar () { console.log(this);

}

new ThisClownCar(); // ссылается на ThisClownCar {}

Стоит заметить, что поведение this в конструкторе весьма неочевидное: если вы случайно забудете дописать new, то this опять будет ссылаться на глобальный объект, как мы уже наблюдали в примере с parentless.

ThisClownCar();

//

ссылается

на

Window

Ручное управление над this

Методы .call, .apply, и .bind используются для управляемого вызова функций, помогая определять оба передаваемых

 

 

 

ualinux.com

More Than USER v14.05(9)

38

programming

значения – this, он же контекст функции,

иarguments.

Метод Function.prototype.call может

принимать любое количество аргументов. Первый из них будет использоваться как this, а оставшиеся будут переданы вызываемой функции как аргументы.

Array.prototype.slice.call([1, 2,

3], 1, 2)

// ссылается на [2]

Метод Function.prototype.apply очень похож на предыдущий, только аргументы в нем передаются одним массивом, вместо неопределенного количеств аргументов, как в методе call.

String.prototype.split.

apply('13.12.02', ['.'])

// ссылается на ['13', '12', '02']

Метод Function.prototype.bind возвращает специальную функцию, которая, в свою очередь, может быть использована для вызова еще одной функции. От ее имени и будет вызван bind. Функция всегда будет использовать переданный ей this, и в тоже время, ей можно передать несколько аргументов, в качестве всегда используемых в возвращаемой функции. Это может быть очень удобно для каррирования оригинальной функции.

var arr = [1, 2];

var add = Array.prototype.push. bind(arr, 3);

// эквивалентно arr.push(3) add();

// эквивалентно arr.push(3, 4) add(4);

console.log(arr);

// ссылается на [1, 2, 3, 3, 4]

Область видимости и this

В следующем случае this будет неизменным в разных областях видимости. Это исключение в правиле и оно часто приводит к ошибкам среди начинающих разработчиков.

function scoping () { console.log(this);

return function () { console.log(this);

};

}

scoping()();

// ссылается на Window

Распространенный способ обойти создавшуюся проблему – это создать локальную переменную, содержащую ссылку на this в текущей функции, а значит, и в ее области видимости. Она останется доступной во вложенной функции. Вложенная функция, в свою очередь, будет иметь свою собственную переменную this, что означает невозможность использования this родительской функции напрямую.

function retaining () { var self = this;

return function () { console.log(self);

};

 

 

 

ualinux.com

More Than USER v14.05(9)

39

programming

}

retaining()();

// ссылается на Window

Если вы все-таки по неизвестным причинам захотите использовать родительский this в качестве контекста для вложенной функции, то можно использовать метод функции .bind. Эта функция может быть использована в том числе для того, чтобы пробросить родительский контекст во вложенную функцию.

function bound () { return function () {

console.log(this);

}.bind(this);

}

bound()();

// ссылается Window

frontender.info

First Line Software

First Line Software пополнила свой продуктовый портфель решениями «1С-Битрикс»

Компания First Line Software, глобальный производитель заказных информационных систем для оптимизации бизнеса, пополнила продуктовый портфель решениями компании «1С-Битрикс». В качестве авторизованного партнера First Line будет разрабатывать для своих клиентов на базе продуктов вендора специализированные программные решения: внутрикорпоративные информационные ресурсы и e-commerce-системы.

«Значительная часть клиентов First Line Software сосредоточена в Европе и США, но пул российских заказчиков постоянно увеличивается. Наша компания работает с широкой линейкой произво-

дителей софта для создания веб-решений

иинтранет-порталов от зарубежных производителей. Со стороны российских клиентов мы увидели большой спрос на решения “1С-Битрикс”, потому было принято решение пополнить портфель First Line Software продуктами игрока российского рынка CMS-систем. Компания “1С-Битрикс” предлагает программное решение с внушительным набором функций, позволяющее выстраивать интернет-

иинтранет-системы любого уровня сложности», — отметил генеральный директор First Line Software Александр Поздняков.

По информации First Line Software, в настоящее время проекты с использованием продуктов «1С-Битрикс» выполняются для двух российских компаний.

cnews.ru

 

 

 

ualinux.com

More Than USER v14.05(9)

40

others

Файл подкачки: swap-файл и swap-раздел в Linux

Все мы знаем, что swap-файлы в Linux делаются просто и легко - настолько просто, что иногда забываем, как это делается. Прежде, чем что-то создавать, хорошо бы узнать, сколько swap-пространства у нас уже имеется в системе - для этого следует дать команду в консоли от рута:

# sudo swapon -s

Результат будет в виде:

Filename Type Size Used Priority /dev/hda1 partition 289128 0 -1

Описание вывода команды:

Filename описывает имеющиеся у вас своп-пространства и где они находятся.

Type указывает тип пространства: partition (раздел) или file (файл).

Size сообщает общий размер Swapпространств.

•Used говорит о том, сколько сейчас свопа задействовано.

•Priority указан приоритет, т.е. какие

пространства системе использовать вначале.

Тот же самый результат мы получим по команде cat /proc/swaps

Создание swap-файла в Linux

1. Открываем консоль\терминал и получаем полномочия root или используем sudo:

$ su

2. Думаем*, какой размер swap-файла нам нужен в мегабайтах. Подумав, даем команду:

sudo dd if=/dev/zero of=/swapfile

bs=1M count=500

или

# dd if=/dev/zero of=/swapfile bs=1M count=500

В команде dd для задания размеров можно использовать суффиксы K, M, G для килобайт, мегабайт и гигабайт соответственно. В данном примере это 500 Mегабайт файла подкачки.

* Многие задаются фундаментальными вопросами бытия вроде "каков рекомендуемый размер swap в linux"? Можно не думать, а просто создать SWAP-файл по размеру оперативной памяти, периодически посматривая на ее, подкачки, использование с помощью команды top. При необходимости добавить\уменьшить своппинг системе. Можно использовать несколько файлов подкачки.

3. Поясняем системе, что созданный пустой файл это все-таки файл подкачки для Linux:

sudo mkswap /swapfile

или

 

 

42

ualinux.com

MoreБольшеThanчемUSERv14v12.05(9).10(5)

42

 

 

 

 

ualinux.com

others

# mkswap /swapfile

Очистка swap-пространства после

 

ресурсоемких приложений

4. Подключаем созданный swap-файл:

Командой swapoff -a, запущенной от

sudo swapon /swapfile

имени root, можно отключить использо-

или

вание всех разделов и файлов подкачки.

# swapon /swapfile

После ввода команды содержимое свопа

 

за несколько минут загружается обратно

При этом в выводе команды top или

в оперативную память, а сам раздел под-

команды free должно появиться упоми-

качки отключается.

нание, что свопинга в системе поприба-

После загрузки содержимого свопа в

вилось. Чтобы отключить файл подкачки,

оперативную память включаем своп об-

пишем

ратно командой swapon -a.

sudo swapoff /swapfile

2. Системные настройки использования

или

своппинга – Linux

# swapoff /swapfile

За интенсивность обращения системы

 

к swap-файлам и swap-разделам отвечает

Чтобы не подключать swap-файл или

параметр swappiness, равный по умолча-

swap-раздел каждый раз, полезно зане-

нию 60. Значение параметра может быть в

сти запись в /etc/fstab следующего содер-

пределах от 0 - наименьшее использова-

жания:

ние подкачки, до 100 - подкачка исполь-

/swapfile none swap sw 0 0

зуется часто.

На всякий случай отметим, что каж-

дый раз создавать swap-файл не нужно:

Насчет оптимального значения пара-

метра swappiness есть много разных мне-

просто подключаете и отключаете его

с помощью swapon/swapoff. Работа со

ний. Так, например, один из ведущих раз-

swap-разделами в Linux происходит ана-

работчиков ядра Эндрю Мортон считает,

логичным образом.

что для десктопа лучше ставить большое

ПриоритетSWAP-файлов

значение, чтобы всякое bloatware скинуть

в своп и использовать оперативную па-

Создавать и использовать swap-файлов

мять для чего-то нужного.

в Linux можно любое количество. При

Чрезмерное значение здесь приведет

этом можно указать приоритет подключа-

к интенсивному использованию swap-

емого swap-файла или раздела (хотя ядро

файла, что нежелательно. Слишком ма-

умеет самостоятельно распределять по

ленькое значение может привести к тому,

разделам/файлам подкачки).

что при заполнении памяти будет прину-

Например, высший приоритет для фай-

дительно запущен OOMkiller (процесс, запу-

ла подкачки задается так:

скающийся при исчерпании памяти и уби-

swapon -p 1 /opt/swapfile

вающий наиболее ресурсоемкие задачи).

Приоритет является целым чис-

Временно (до перезагрузки систе-

лом от 0 до 32767.

мы) изменить этот параметр можно с

БольшеMore ThanчемUSERv14v12.05(9).10(5) 4343

others

помощью команды:

echo 50 > /proc/sys/vm/ swappiness

Чтобы изменить значение по умолчанию, необходимо изменить параметр vm.swappiness:

vm.swappiness=50

в файле /etc/sysctl.conf

Следует, впрочем, отметить, что со vm.swappiness сильно перегибать палку не стоит. При больших значениях система потеряет в отзывчивости (будет вытеснять память, с которой работают приложения, в своп, хотя оперативной памяти еще много). При малых значениях система работает отзывчивей, но когда оперативная память заканчивается, система начинает активно свопиться и притормаживать.

Также можно попробовать увеличить\ уменьшить объем потребляемой систе-

мой памяти за счет изменения размеров дискового кеша. Уровень выделяемой под кеш памяти хранится в

/proc/sys/vm/vfs_cache_pressure Значение по умолчанию: 100. Чтобы ис-

пользовать меньше памяти под дисковые кеши (что вообще говоря не есть хорошая идея), ставим значение 50. Если, наоборот, хочется больше отзывчивости системы, увеличиваем размер кеша не скупясь:

echo 1000 > /proc/sys/vm/vfs_ cache_pressure

и далее продолжаем играться с параметрами вплоть до полного удовлетворения. Для того, чтобы настройки стали постоянными, заносим параметр

vm.vfs_cache_pressure = 1000

в файл /etc/sysctl.conf и со следующей загрузки дисковые кеши будут с радостью пользоваться вашей оперативной памятью. mydebianblog.blogspot.com

 

 

44

ualinux.com

MoreБольшеThanчемUSERv14v12.05(9).10(5)

44

 

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]