«Единственный способ творить великие дела – это любить то, что ты делаешь»
JavaScript
site.komp36.ru Создание сайтов. Твой сайт фотографа Что есть на сайте? Несколько фото галерей: свадебная, постановочная съемка, love story, детские фото. Договор на фотосъемку, прайс-лист.
site.komp36.ru Продающий лендинг. Создание сайтов Установка и продажа окон, установка дверей, перегородок. Одностраничный продающий сайт. Заявки прямо с сайта
site.komp36.ru Универсальный лендинг. Выбрать тему для сайта! Лендинг адаптируется под любую тему: ремонт, отделка, продажа окон, дверей, лестниц, мебели и многое другое
site.komp36.ru Создание сайтов. Сайт сервисного центра. Сайт компании. Новости и отзывы. Несколько прайс-листов – под каждый отдельная страница. Возможность размещения статей


Игра «Морской Бой» на 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

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

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

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

site.komp36.ruТвой сайт фотографа. Создание сайтов Что есть на сайте? Несколько фото галерей: свадебная, постановочная съемка, love story, детские фото. Договор на фотосъемку, прайс-лист.
site.komp36.ru Акция Как начать свое дело? Свой сайт «Укладка плитки» 9 000 руб. Лендинг адаптируется под любой вид отделочных работ, продажу товаров или услуг. Сайт поможет найти новых клиентов
site.komp36.ru Акция Продающий лендинг «Установка и продажа окон» 9 000 руб. Одностраничный продающий сайт. Установка и продажа окон, установка дверей, перегородок. Заявки прямо с сайта

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

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

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

Ваше Имя:

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

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

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


Задачи по JavaScript
Тематические публикации
site.komp36.ru Как начать свое дело? Свой сайт «Укладка плитки» 9 000 руб. Лендинг адаптируется под любой вид отделочных работ, продажу товаров или услуг. Сайт поможет найти новых клиентов
site.komp36.ru Продающий лендинг «Установка и продажа окон» 9 000 руб. Одностраничный продающий сайт. Установка и продажа окон, установка дверей, перегородок. Заявки прямо с сайта
Популярные заметки
Последние заметки