представлять
Некоторые из режимов, которые мы представили в этой статье, называются режимом инициализации и режимом производительности, которые в основном используются для инициализации и улучшения производительности. Некоторые режимы были упомянуты ранее, так что вот просто резюме.
Функции, которые выполняются немедленно
В 4 -й главе этой серии «Функциональные выражения, вызванные сейчас», мы подробно описали аналогичные функции. Здесь мы просто приведем два простых примера для обобщения.
Кода -копия выглядит следующим образом:
// после объявления функции немедленно выполните функцию
(function () {
console.log ('Leting Out!');
} ());
// функции, объявленные таким образом, также могут быть немедленно выполнены
! function () {
console.log ('Leting Out!');
} ();
// Следующий метод также в порядке
~ function () { / * code * /} ();
-function () { / * code * /} ();
+function () { / * code * /} ();
Немедленно выполненная инициализация объекта
Этот шаблон означает, что когда объект объявлен (не функция), один из методов в объекте будет немедленно выполнен для выполнения работы по инициализации. Обычно этот шаблон можно использовать в коде, выполненном за один раз.
Кода -копия выглядит следующим образом:
({
// здесь вы можете определить константы и установить другие значения
MAXWIDTH: 600,
Maxheight: 400,
// Конечно, вы также можете определить методы утилиты
gimmemax: function () {
вернуть this.maxwidth + "x" + this.maxheight;
},
// инициализация
init: function () {
console.log (this.gimmemax ());
// больше кода ...
}
}). init (); // это начинает инициализацию
Инициализация ветви
Инициализация ветви относится к инициализации различных кодов в соответствии с различными условиями (сценариями), которая является так называемым условным назначением заявления. Раньше, когда мы делали обработку событий, мы обычно использовали коды, такие как следующие:
Кода -копия выглядит следующим образом:
var utils = {
AddListener: function (el, type, fn) {
if (typeof window.addeventListener === 'function') {
el.addeventlistener (type, fn, false);
} else if (typeof document.attachevent! == 'undefined') {
el.attachevent ('on' + type, fn);
} еще {
el ['on' + type] = fn;
}
},
RemoveListener: function (el, type, fn) {
}
};
Давайте улучшим это. Во -первых, нам нужно определить два интерфейса: один для ручки Add Event, а другой для удаления ручки событий. Код заключается в следующем:
Кода -копия выглядит следующим образом:
var utils = {
addlistener: null,
RemoveListener: Null
};
Код реализации выглядит следующим образом:
Кода -копия выглядит следующим образом:
if (typeof window.addeventListener === 'function') {
utils.addlistener = function (el, type, fn) {
el.addeventlistener (type, fn, false);
};
} else if (typeof document.attachevent! == 'undefined') {// ie
utils.addlistener = function (el, type, fn) {
el.attachevent ('on' + type, fn);
};
utils.removelistener = function (el, type, fn) {
el.detachevent ('on' + type, fn);
};
} else {// другие старые браузеры
utils.addlistener = function (el, type, fn) {
el ['on' + type] = fn;
};
utils.removelistener = function (el, type, fn) {
el ['on' + type] = null;
};
}
Разве не очень удобно использовать? Код гораздо более элегантен.
Функции самообладания
Как правило, код функции того же имени переписывается внутри функции, например:
Кода -копия выглядит следующим образом:
var screme = function () {
оповещение ("Бу!");
scarme = function () {
оповещение ("Double Boo!");
};
};
Этот вид кода очень сбивает с толку. Давайте сначала посмотрим на результаты исполнения примера:
Кода -копия выглядит следующим образом:
// 1. Добавить новые атрибуты
scarme.property = "правильно";
// 2. Сбала присваивает новое значение
var prank = scarme;
// 3. Вызовите как метод
var spooky = {
Бу: Скарм
};
// звонок с новым именем переменной
шутка (); // "Бу!"
шутка (); // "Бу!"
console.log (Prank.property); // "правильно"
// вызов с помощью метода
Spooky.boo (); // "Бу!"
Spooky.boo (); // "Бу!"
console.log (Spooky.boo.property); // "правильно"
Благодаря результату выполнения можно обнаружить, что назначение функции новой переменной (или внутреннему методу) код не выполняет перегруженный код Scarme, а следующий пример - точно противоположный:
Кода -копия выглядит следующим образом:
// Использование функций самообнановления
scarme (); // Двойной бу!
scarme (); // Двойной бу!
console.log (screme.property); // неопределенный
При использовании этой модели вы должны быть очень осторожны, в противном случае фактический результат может отличаться от ожидаемого результата. Конечно, вы также можете использовать это специальное предложение для выполнения специальных операций.
Оптимизация памяти
Эта шаблона в основном использует характеристики атрибута функции, чтобы избежать большого количества повторяющихся расчетов. Обычная форма кода выглядит следующим образом:
Кода -копия выглядит следующим образом:
var myfunc = function (param) {
if (! myfunc.cache [param]) {
var result = {};
// ... сложная операция ...
myfunc.cache [param] = result;
}
вернуть myfunc.cache [param];
};
// хранилище кеша
myfunc.cache = {};
Тем не менее, есть проблема с вышеуказанным кодом. Если пропущенный параметр является ToString или некоторыми общими методами, аналогичными объектам, возникнет проблема. В настоящее время вам нужно использовать легендарный метод HasownProperty, код заключается в следующем:
Кода -копия выглядит следующим образом:
var myfunc = function (param) {
if (! myfunc.cache.hashownproperty (param)) {
var result = {};
// ... сложная операция ...
myfunc.cache [param] = result;
}
вернуть myfunc.cache [param];
};
// хранилище кеша
myfunc.cache = {};
Или, если вы передаете несколько параметров, вы можете использовать метод json stringify для создания значения кешки для хранения. Код заключается в следующем:
Кода -копия выглядит следующим образом:
var myfunc = function () {
var cachekey = json.stringify (array.prototype.slice.call (аргументы)),
результат;
if (! myfunc.cache [cachekey]) {
result = {};
// ... сложная операция ...
myfunc.cache [cachekey] = result;
}
вернуть myfunc.cache [cachekey];
};
// хранилище кеша
myfunc.cache = {};
Или несколько параметров, вы также можете использовать функцию Arguments.callee:
Кода -копия выглядит следующим образом:
var myfunc = function (param) {
var f = arguments.callee,
результат;
if (! f.cache [param]) {
result = {};
// ... сложная операция ...
f.cache [param] = result;
}
вернуть f.cache [param];
};
// хранилище кеша
myfunc.cache = {};
Суммировать
Не нужно суммировать, просто внимательно посмотрите на код