Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 22.08.2019
Сообщений: 8

Область видимости функции и передача аргументов

02.05.2020, 19:58. Показов 2237. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Никак не получается понять, что происходит в данной ситуации. Так если интересует два вопроса:
1. Что именно мы передаем в функцию a в качестве аргумента?
2. Внутри какой области видимости объявляется (создается) функция b

JavaScript
1
2
3
4
5
function a(x){
    console.log(x);
}
 
a(function b(){});
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2020, 19:58
Ответы с готовыми решениями:

Область видимости функции
Доброго времени суток. Суть задачи такова: хочу во время ожидания ответа сервера, рядом с курсором вставить gif анимашку. То есть...

Область видимости в анонимной функции
for (var i = 0; i < players_array.length; /* Пускай players_array.length будет равно 2*/ i++) { //Вывод числа итераций ...

Передача данных в другую область видимости
Задание 1. Написать следующие функции для работы с динамическим массивом: a. Функция распределения динамической памяти. b. Функция...

7
108 / 76 / 27
Регистрация: 14.11.2016
Сообщений: 260
02.05.2020, 22:41
1. В качестве аргумента в функцию a передается функция b, a - функция высшего порядка
2. b объявлена в глобальной области видимости, внутри b можешь написать
JavaScript
1
console.log(this) // выведет window
Ну и еще - не совсем понятно назначение кода, там либо должно быть
JavaScript
1
2
3
4
5
function a(x){
    console.log(x());
}
 
a(function b(){});
Либо так
JavaScript
1
2
3
4
5
function a(x){
    console.log(x);
}
 
a((function b(){})());
0
0 / 0 / 1
Регистрация: 22.08.2019
Сообщений: 8
03.05.2020, 00:38  [ТС]
А можно ещё уточнить, почему мне после этого кода не удаётся вызвать функцию b, если по идее она находится в глобальной области видимости?
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.05.2020, 07:17
Цитата Сообщение от ZennoKrolikW Посмотреть сообщение
2. Внутри какой области видимости объявляется (создается) функция b
На правах аргумента функции. Область видимости аргумента ограничена функцией a().
1
108 / 76 / 27
Регистрация: 14.11.2016
Сообщений: 260
03.05.2020, 13:12
как правильно отметил amr-now, на правах аргумента. То есть, лексически b глобальна (this === window), а динамически она внутри a
0
41 / 21 / 11
Регистрация: 30.04.2020
Сообщений: 26
03.05.2020, 15:54
Лучший ответ Сообщение было отмечено DrType как решение

Решение

Цитата Сообщение от ZennoKrolikW Посмотреть сообщение
почему мне после этого кода не удаётся вызвать функцию b, если по идее она находится в глобальной области видимости?
Потому что эта функция Named Function Expression (Именованной Функции Выражение), несмотря на то, что её объявление похоже на Function Declaration (Функции Объявление, это a в данном примере), это не так, за счёт того, что она объявляется в круглых скобках. Поэтому вызвать b без ошибок можно только внутри функции b, например:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let b;
 
function a(x) {
    x.z = 0
    x(); // 2
    b=x;
}
 
a(function b() {
    if(b.z++) { console.log(b.z); }
    else { b(); }
});
 
b(); // 3
Но b можно вытащить присвоив глобальной переменной.
3
0 / 0 / 1
Регистрация: 22.08.2019
Сообщений: 8
04.05.2020, 13:08  [ТС]
Спасибо, докопался до сути. Путаница была именно с этим именем, так как не понимал что существует именно Named Function Expression помимо обычного Function Expression и что они по большому счету имеют один и тот же смысл.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.05.2020, 16:30
Лучший ответ Сообщение было отмечено ZennoKrolikW как решение

Решение

ZennoKrolikW, сам термин Function Expression уже вводит в заблуждение.
Понятнее сказать - литерал функции.
Есть литерал целого числа 5.
Литерал регулярного выражения /abc/i.
Литерал объекта типа Object {a: "bc"}
Соответственно, литерал функции function (n) { return n * n; } или (n) => n * n

Имя функции в литерале функции используется для внутреннего применения внутри самой функции.

Теперь приведем аналогии.
JavaScript
1
var a = {a: "bc"}; // В переменную положили ссылку на объект, который создан по информации из литерала объекта
Function Declaration
JavaScript
1
function quad(n) { return n * n; }
равно
JavaScript
1
var quad = function quad(n) { return n * n; };
Аналогично, при вызове функции аргументом можно передать литерал или ссылку на объект:
JavaScript
1
show ( {a: "bc"} );
можно заменить на
JavaScript
1
show ( a ); // если в переменной хранится ссылка на {a: "bc"}
Так же можно передать аргументом и функцию. Или непосредственно литерал, или ссылку на функцию
JavaScript
1
show( function quad(n) { return n * n; } );
можно заменить на
JavaScript
1
show ( quad ); // если в переменной хранится ссылка на function quad(n) { return n * n; }
То есть чтобы обратиться к объекту по имени, сначала нужно присвоить объект в переменную
или передать литерал или ссылку на объект в параметр функции.
Например:
JavaScript
1
2
3
4
var n = 5; 
doit ( n );
 
function doit ( x ) { return x + 10; }
Мы декларировали переменную n.
Передали n аргументом в функцию doit.
Но параметр в функции doit называется x. И обращается функция внутри уже к иксу, а не к n.
Вот такое переименование имён происходит именно при передаче аргумента в функцию.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2020, 16:30
Помогаю со студенческими работами здесь

Область видимости функции
Добрый день! Есть класс, конструктор отрисовывает три кнопки, пытаюсь к событию Release привязать функцию из этого же класса, но внутри...

Область видимости static функции
Почему программа работает, статическая функция sum вроде как не должна быть видна в main.c?? main.c #include <stdio.h> ...

Дружественные функции и область видимости
Компилятор mingw 4.9.3 (-std=c++14). Есть класс, определённый в SomeClass.h, в котором заявлена дружественная функция: class SomeClass...

Область видимости анонимного объекта при вызове функции
Доброго дня. Хотел поинтересоваться: когда уничтожится анонимный объект, переданный как параметр функции? #include <stdio.h> ...

Вызов функции до ее определения или область видимости функций в FireFox
Добрый день! Наткнулся на такую особенность в FireFox - если использовать такую конструкцию: { test2(); function test2(){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru