Продолжайте с предыдущей статьей «Как написать высококачественный код JS». На этот раз я разберусь по моментам знаний о функциях JavaScript.
2. Используйте функции
Функции предоставляют программистам основные абстрактные функции и механизмы реализации. Функции могут независимо реализовать несколько различных функций на других языках, таких как процедуры, методы, конструкторы и даже классы или модули.
2.1 Понять различия между вызовами функций, вызовами методов и вызовами конструктора
Для объектно-ориентированного программирования конструктор функций, методов и классов представляет собой три разных понятия.
Режим использования:
1. Функциональный вызов
Кода -копия выглядит следующим образом:
функция Hello (имя пользователя) {
вернуть "Привет" + имя пользователя;
}
2. Метод вызов
Кода -копия выглядит следующим образом:
var obj = {
Привет: function () {
вернуть "привет" + this.username;
},
Имя пользователя: "Floralam"
};
ohj.hello (); // "Привет, Floralam"
Эта переменная связана с объектом, потому что метод Hello определяется в объекте OBJ. Мы также можем назначить копию той же ссылки на функцию в другом объекте и получить один и тот же ответ.
Кода -копия выглядит следующим образом:
var obj2 = {
Привет: obj.Hello (),
Имя пользователя: "Floralam"
};
3. Используйте конструктор
Кода -копия выглядит следующим образом:
Пользователь функции (имя, пароль) {
this.name = name;
this.passwordhash = passwordhash;
}
Вызов пользователя с использованием нового оператора считается конструктором.
Кода -копия выглядит следующим образом:
var u = новый пользователь ("floralam", "123");
В отличие от вызовов функций и вызовов методов, вызов конструктора принимает совершенно новый объект в качестве значения этой переменной и неявно возвращает этот новый объект в качестве результата вызова. Основная ответственность конструктора - инициализация нового объекта.
2.2 Опытный в расширенных функциях
Функции высшего порядка-это не что иное, как функции, которые принимают функции в качестве параметров или возвращаемых значений, и используют функции в качестве параметров (обычно называемых функциями обратного вызова, поскольку функции высшего порядка «впоследствии называют» его) являются особенно мощной и выразительной идиомой и также широко используются в программах JS.
Рассмотрим стандартный метод сорта массивов. Чтобы работать для всех массивов, метод сортировки требует, чтобы абонент решил, как сравнить любые два элемента в массиве.
Кода -копия выглядит следующим образом:
Функция сравнительного числа (x, y) {
if (x <y) {
возврат -1;
}
if (x> y) {
возврат 1;
}
возврат 0;
}
[3,1,4,1,5,9]. Сорт (сравнительные); // [1,1,3,4,5,9]]
Кода -копия выглядит следующим образом:
[3,1,4,1,5,9] .Sort (function (x, y) {
if (x <y) {
возврат -1;
}
if (x> y) {
возврат 1;
}
возврат 0;
}); // [1,1,3,4,5,9]
Приведенный выше пример использует анонимную функцию для дальнейшего упрощения.
Обучение использования функций более высокого порядка может часто упростить код и устранить утомительный код шаблона. Для простого преобразования строковых массивов мы можем использовать цикл, чтобы реализовать его так:
Кода -копия выглядит следующим образом:
var names = ["fred", "wilma", "Pebbles"];
var opper = [];
for (var i = 0, n = names.length; i <n; i ++) {
Верхний [i] = имена [i] .touppercase ();
}
Верхний; // ["Фред", "Вилма", "Капббл"];
Используя удобный метод карты массивов, вы можете устранить петли и преобразовать элементы один за другим, используя только одну локальную функцию.
Кода -копия выглядит следующим образом:
var names = ["fred", "wilma", "Pebbles"];
var opper = names.map (function (name) {
return name.touppercase ();
});
Верхний; // ["Фред", "Вилма", "Капббл"];
Кроме того, например, мы хотим создать несколько методов для создания различных строк с общей логикой реализации, и каждый цикл создает строку, подключая результаты расчета каждой независимой части.
Кода -копия выглядит следующим образом:
Функция bulidstring (n, обратный вызов) {
var result = "";
для (var i = 0; i <n; i ++) {
Результат += обратный вызов (i);
}
результат возврата;
}
var alphabet = bulidstring (26, function (i) {
return string.fromCharcode (aindex + i);
});
Alphabet; // "abcdefghijklmnopqrxtuvwxyz";
var Digits = buildString (10, function (i) {return i;})
цифры; // "0123456789"
var random = buildstring (9, function () {
random += string.fromCharcode (math.floor (math.random ()*26) +aindex
});
случайный; // "yefjmcef" (случайный)
Это даст читателям более четкое понимание того, что может обойтись без подробных деталей реализации.
Примечание
JavaScript возвращает формулу для случайных чисел (между MNS) указанного диапазона: math.random ()*(nm)+m
В то же время обратите внимание на требования к вопросу и необходимо ли вернуть положительное целое число.
2.3 Режим вызова
Вызов функции приостановит выполнение текущей функции и передает права управления и параметры управления новой функции. В дополнение к формальным параметрам, определенным во время объявления, каждая функция получает два новых дополнительных параметров: это и аргументы.
Это очень важный параметр, и его значение определяется призванной шаблоном.
Вот 4 очень важных шаблонов вызова в JavaScript:
а Метод образец вызова
беременный Шаблон вызова функции
в Шаблон вызова конструктора
дюймовый Применить шаблон вызовов. Применить шаблон вызова
Есть различия в том, как эти шаблоны инициализируют ключевые параметры
1. Метод вызова метода
Когда функция является методом объекта, мы называем это методом. Когда метод вызывается, это связано с вызываемым объектом.
Кода -копия выглядит следующим образом:
var myobj = {
ВАЛ: 0,
Приращение: function (inc) {
this.val+= typeof inc === "номер"? Inc: 1;
},
get_val: function () {return this.val;}
}
myobj.increment (); // 1
myobj [«Приращение»] (2); // 3
краткое содержание:
1. Метод, в котором контекст объекта, к которому они принадлежат, может быть получен через это, называется публичным методом
2. При использовании функции с. или выражение индекса, это режим вызова метода, и этот объект связан с предыдущим объектом.
3. Функция может использовать это для доступа к объекту, поэтому она может получить значение объекта или изменить значение объекта. Связывать это с объектом происходит при вызове.
2. Образец вызова функции
Когда функция не является свойством объекта, она называется функцией. Когда функция называется как шаблон вызова функции, это связано с глобальным объектом. Это ошибка дизайна JavaScript и продолжается.
Кода -копия выглядит следующим образом:
функция добавить (x, y) {
вернуть x+y;
}
myobj.double = function () {
var that = это;
var helper = function () {
это. Val = add (that.value, that.value);
// Неправильный способ написания может быть таким, почему это неправильно? Потому что, когда функция называется внутренней функцией, она связана с неправильным объектом, а глобальный объект не имеет свойства Val, поэтому неверное значение возвращается.
//this.val = this.val+this.val;
}
Helper ();
}
myobj.double (); // 6
3. Образец вызова конструктора
JavaScript - это язык, основанный на прототипе наследования, что означает, что объекты могут непосредственно наследовать атрибуты от других объектов, а язык бескласлен.
Если вы позвоните по функции с новой, вы получите новый объект, который скрывает член прототипа, подключенный к функции, и это также будет связано с новым объектом.
Новый префикс также меняет поведение оператора возврата. Это не рекомендуемый метод программирования.
Кода -копия выглядит следующим образом:
var foo = function (status) {
this.status = status;
}
Foo.prototype.get_status = function () {
вернуть это.status;
}
// построить экземпляр Foo
var myfoo = new foo ("bar");
myfoo.get_status (); // "bar"
4. Примените применить шаблон. Применить шаблон вызова применения
Поскольку JavaScript является функциональным объектно-ориентированным языком, функции могут иметь методы.
Метод применения имеет два параметра. Первое - привязать значение с этим, а второе - массив параметров. То есть метод применения позволяет нам создавать массив и использовать его для вызова функции, что позволяет нам выбрать значение этого, а также позволяет нам выбрать значение массива.
Кода -копия выглядит следующим образом:
var array = [3,4];
var sum = add.apply (null, массив); // 7
var satursObj = {status: "abcdefg"};
Foo.prototype.pro_get_status = function (prefix) {
вернуть префикс +"-" +this.status;
}
var status = foo.prototype.get_status.apply (satternobj); // "abcdefg"
var pro_status = foo.prototype.get_status.apply (satternobj, ["prefix"]); // "prefix -abcdefg"
Как правило, приемник функции или метода (уровень, связанный со значением этого специального ключевого слова) определяется синтаксисом вызывающего абонента. В частности, синтаксис вызова метода связывает метод с этой переменной с помощью объекта поиска. Однако иногда необходимо вызовать функции с помощью пользовательского приемника. В настоящее время вам необходимо использовать метод вызова или метод привязки для настройки приемника для вызова метода
2.4 Извлекать методы с определением получателей с использованием метода связывания
Поскольку метод ничем не отличается от атрибутов, значения которых являются функциями, также легко извлечь метод объекта, извлечь функцию в качестве функции обратного вызова и передавать ее непосредственно в функцию высшего порядка.
Но также легко забыть связать извлеченную функцию с извлеченным объектом.
Кода -копия выглядит следующим образом:
var buffer = {
Записи: [],
добавить: функция (s) {
this.Entries.push (ы);
}
}
var source = ["867", "-", "5309"];
Source.Foreach (Butter.Add); // Ошибка: записи не определены
В настоящее время получатель масла. Адд не является объектом масла. Приемник функции зависит от того, как она называется, и метод Foreach вызывается в глобальной области, поэтому реализация метода Foreach использует глобальный объект в качестве приемника по умолчанию. Поскольку в глобальном объекте нет атрибута записей, этот код бросает ошибку.
Метод Foreach позволяет вызывающему абоненту предоставлять дополнительный параметр в качестве приемника функции обратного вызова.
Кода -копия выглядит следующим образом:
var source = ["867", "-", "5309"];
Source.foreach (Butter.add, масло);
Но не все функции высшего порядка осторожны и вдумчивы, чтобы предоставить пользователям приемник функций обратного вызова.
Есть два решения:
1) Создайте явный метод буфера, чтобы вызовать функцию добавления инкапсуляции. Независимо от того, как называется функция инкапсуляции, она всегда гарантирует, что ее параметры втянуты в целевой массив.
Кода -копия выглядит следующим образом:
var source = ["867", "-", "5309"];
Source.foreach (функция (s) {
масло.add (ы);
});
2) Метод связывания функционального объекта требует объекта приемника и генерирует функцию инкапсуляции, которая вызывает исходную функцию с помощью метода, вызываемого объектом приемника.
Кода -копия выглядит следующим образом:
var source = ["867", "-", "5309"];
Source.foreach (Butter.add.bind (Buffer));
Примечание
Buffer.add.bind (Buffer) создает новую функцию вместо изменения функции Buffer.Add:
buffer.add === buffer.add.bind (буфер); //ЛОЖЬ
Выше приведено в этой статье, надеюсь, вам понравится.