Далее на странице...
В информатике существует термин Javascript это тот язык, в котором это понятие применимо к функциям.
.Но обо всем по порядку. Сначала нужно ответить на вопрос: что такое первоклассные значения в программировании?
Для первоклассных значений характерно следующее:
-
Их можно присваивать переменным или сохранять/заносить в массив или объект.
-
Передавать эти значения функциям в качестве параметра.
-
Возвращать из функций.
В Javascript все перечисленные действия можно выполнять с функциями. То есть функцию можно присвоить переменной, передать в другую функцию в качестве параметра или вернуть из функции.
Здесь уже шла речь о том, что функции можно рассматривать как значения. А также о том, как происходит присваивание функции переменной.
Поэтому далее поговорим о том, как происходит передача функции в качестве параметра в другую функцию.
Первоклассные значения в javascript?
Как известно в Javascript существует 5 псевдоложных значений:
- undefined - неопределенное значение
- null - несуществующий объект
- 0 - ноль
- «empty string» - пустая строка
- NaN - не число
А вот примеры псевдоистинных значений:
- object - объект
- array - массив
- number - число
- string - строка
Напомним, что псевдоложные значения при составлении условий возвращают ложь false, а псевдоистинные, соответственно, истину true.
Передача функции в функцию
Для примера того, как в Javascript происходит передача функции другой функции, возьмем массив, состоящий из объектов.
Каждый объект массива состоит из двух свойств: value и returned. Первое содержит название одного из псевдоложных значений, значением второго является ложь - false:
var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: false},
{value: '0', returned: false},
{value: 'empty string', returned: false},
{value: 'array', returned: false},
]
То есть исходный массив - это своего рода структура данных, которая содержит перечень всех псевдоложных значений и указание на то, что все они при составлении условий возвращают ложь false.
Сделаем в нашей структуре некоторые изменения: Во-первых, укажем, что одно из псевдоложных значений возвращает истину true, что является ошибкой и, во-вторых, вместо одного из псевдоложных значений укажем псевдоистиное, что также не допустимо, так как предполагается, что исходный массив должен содержать исключительно псевдоложные значения.
var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: true}, /* ошибка */
{value: '0', returned: false},
{value: 'string', returned: false}, /* ошибка */
{value: 'array', returned: false},
]
Итак, в массиве из объектов сделано две ошибки:
1. В нем присутствует псевдоистиное значение string.
2. Указано, что псевдоложное значение null возвращает истину true.
Используя передачу функции в качестве параметра другой функции, проверим массив и выявим ошибки. Для этого:
Составим одну основную функцию, которая будет перебирать все значения массива, то есть каждый из объектов.
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){ /* if true */
return false
}
}
return true
}
Немного комментариев
-
Функция analysis_each анализирует каждый элемент массива array на предмет его истинности (будем анализировать массив pseudo_false).
-
Функция возвращает false, если условие истинно и на этом заканчивает свою работу. Если же условие ложно, то цикл повторяется.
-
Если ошибок в массиве не найдено, то функция возвращает true.
Теперь составим вспомогательные функции, которые мы будем передавать в качестве параметра в основную функцию.
С помощью 1-ой в условии функции analysis_each будут рассматриваться значения свойства returned каждого объекта массива. На данном этапе задача состоит в том, чтобы выяснить, есть ли среди них true.
function analysis_returned(array){
return (array.returned);
}
2-я функция предназначена для сравнения значения свойства value каждого объекта массива с псевдоистиным значением string. Результат этого сравнения также будет фигурировать в условии основной функции.
function analysis_value(array){
return (array.value == "string");
}
Теперь мы можем приступить к тому, ради чего написана эта статья: к передаче функции в качестве параметра в другую функцию.
Итак, передаем поочередно каждую из вспомогательных функций analysis_returned и analysis_value в основную функцию analysis_each.
При этом каждый раз функцию analysis_each будем присваивать переменной.
var search_true = analysis_each(pseudo_false, analysis_returned);
if(!search_true)
{
console.log('Ошибка, одному из псевдоложных значений присвоена ИСТИНА');
}
var search_string = analysis_each(pseudo_false, analysis_value);
if(!search_string)
{
console.log('Внимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"');
}
Немного комментариев
-
Функция analysis_returned будучи переданной в качестве параметра в analysis_each позволяет проверить значение свойства returned каждого объекта массива pseudo_false.
-
Функция analysis_value при передачи в функцию analysis_each позволяет проверить свойство value каждого объекта массива pseudo_false.
-
Одновременно с этим мы дважды присваиваем функцию analysis_each различным переменным.
Далее приведен весь код этого примера.
<script type="text/javascript">
/* Массив из объектов: псевдо ЛОЖНЫЕ значения */
var pseudo_false =
[
{value: 'undefined', returned: false},
{value: 'null', returned: true}, /* ошибка */
{value: '0', returned: false},
{value: 'string', returned: false}, /* ошибка */
{value: 'array', returned: false},
]
/* Основная функция analysis_each перебирает все элементы массива (все объекты), каждый из которых является параметром функции analysis_function */
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){ /* if true */
return false
}
}
return true
}
/* Функция для анализа свойства returned */
function analysis_returned(array){
return (array.returned);
}
/* Функция для анализа свойства value */
function analysis_value(array){
return (array.value == 'string');
}
/* Присваивание функций переменным */
var search_true = analysis_each(pseudo_false, analysis_returned);
if(!search_true){
console.log('Ошибка, одному из псевдо ЛОЖНЫХ значений присвоена ИСТИНА');
}
else{
console.log('No Error');
}
var search_string = analysis_each(pseudo_false, analysis_value);
if(!search_string){
console.log('Внимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"');
}
else{
console.log('No Error');
}
</script>
Передача функции другой функции
Ошибка, одному из псевдо ЛОЖНЫХ значений присвоена ИСТИНАВнимание, в списке псевдоложных значений присутствует псевдоИСТИНОЕ значение "string"
Передача функции в функцию - Тонкости и нюансы
Теперь составим массив из псевдоиcтинных значений.
var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: true},
{value: 'number', returned: true},
{value: 'string', returned: true},
]
Сделаем в нем ошибку:
var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: false}, /* ошибка */
{value: 'number', returned: true},
{value: 'string', returned: true},
]
Пробуем проверить. Ищем в массиве false.
При этом функция analysis_returned не сможет нам в этом помочь. Почему?
Потому, что значения свойств returned в массиве pseudo_true в основном равны true. Как вы помните, если в условии функции analysis_each будет истина, то она выдаст нам false, а значит ошибку, в то время как в данном случае ошибки нет.
Выходит, что мы увидим ошибку в любом случае: есть она или нет.
Значит, для проверки массива pseudo_true нужна отдельная вспомогательная функция. Назовем ее analysis_returned_true.
function analysis_returned_true(array){
return (!array.returned);
}
Как видите функция analysis_returned_true идентична функции analysis_returned, но с одной существенной разницей: благодаря восклицательному знаку !array.returned мы будем получать значение свойства returned противоположное реально существующему.
Так как же теперь будет работать функция analysis_each, если в нее в качестве параметра передать функцию analysis_returned_true?
Напомним, как выглядит функция analysis_each:
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){ /* if true */
return false
}
}
return true
}
Немного комментариев.
-
Теперь значения true свойства returned массива pseudo_true будут фигурировать в условии функции analysis_each как ложные, и цикл будет повторяться.
-
Если же свойство returned будет равно false, то в условии функции analysis_each окажется истина true и проверка будет остановлена. Таким образом, ошибка будет найдена.
Далее приведен весь код, где проводится работа с массивом из псевдоистинных значений.
<script type="text/javascript">
/* Массив из объектов: псевдо ИСТИННЫЕ значения */
var pseudo_true =
[
{value: 'object', returned: true},
{value: 'array', returned: true},
{value: 'number', returned: false}, /* ошибка */
{value: 'string', returned: true},
]
/* Основная функция analysis_each перебирает все элементы массива (все объекты), каждый из которых является параметром функции analysis_function */
function analysis_each(array, analysis_function){
for(i = 0; i < array.length; i++){
if(analysis_function(array[i])){ /* if true */
return false
}
}
return true
}
/* Функция для анализа свойства returned */
function analysis_returned_true(array){
return (!array.returned);
}
/* Присваивание функций переменной */
var search_false = analysis_each(pseudo_true, analysis_returned_true);
if(!search_false){
console.log('Ошибка, одному из псевдо ИСТИННЫХ значений присвоена ЛОЖЬ');
}
else{
console.log('No Error');
}
</script>
Передача функции в другую функцию - Пример №2
Ошибка, одному из псевдо ИСТИННЫХ значений присвоена ЛОЖЬ
В зависимости от способностей, тема передачи функции другой функции может оказаться довольно сложной для понимания. Но постарайтесь вникнуть.