«Единственный способ творить великие дела – это любить то, что ты делаешь»
JavaScript



Игра «Морской Бой» на JavaScript: Простая Игра и Игра для Двоих



В информатике существует термин «Первоклассные значения». 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

Ошибка, одному из псевдо ИСТИННЫХ значений присвоена ЛОЖЬ

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

Читайте также...



Отзывы и комментарии:

Комментариев нет...

Оставить отзыв:

Ваше Имя:

Текст комментария:

Ответьте на вопрос:

Сколько дней в Високосном году?


Задачи по JavaScript

Тематические публикации
Популярные заметки
Последние заметки