Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

Объясните строку в коде пожалуйста

20.06.2013, 11:04. Показов 1655. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Недавно начал изучение javascript, поначалу всё не плохо понимал, но сейчас дело дошло до замыканий, обёрток и this - у меня в голове теперь просто каша. В общем, имеется задача:
"Создайте декоратор makeLogging(func, log), для функции func возвращающий обёртку, которая при каждом вызове добавляет её аргументы в массив log. Допускается func с любым набором аргументов."
Это её решение:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function work(a, b) {
  alert(a + b); // work - произвольная функция
}
 
function makeLogging(f, log) {
  
  function wrapper() {
    log.push(arguments);
    return f.apply(this, arguments);  
  }
 
  return wrapper;
}
 
var log = [];
work = makeLogging(work, log);
 
work(1, 2); // 3
work(4, 5); // 9
 
for(var i=0; i<log.length; i++) {
  alert( 'Лог:' + [].join.call(log[i]) ); // "Лог:1,2", "Лог:4,5"
}
Мне не понятна вот эта строка:
JavaScript
1
return f.apply(this, arguments);
Я понимаю, что this здесь передаётся на всякий случай, если функция "makeLogging(f, log)" будет методом объекта, и чтобы передавалась в контексте(поправте пожалуйста если я не прав). Но вместе с this, передаются и аргументы функции wrapper, но ведь argumets - это объект, почему в передавая его, в функции work срабатывает a+b? Интерпритатор сам приводит эти аргументы к виду "this, первый аргумент, второй аргумент"? Если да, то почему не работает такой вызов
JavaScript
1
return f(arguments);
Объясните пожалуйста. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2013, 11:04
Ответы с готовыми решениями:

Объясните пожалуйста одну строку в коде
Объясните пожалуйста . #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; void mystrcat(char *s1,char *s2,int...

Объясните пожалуйста одно место в коде
Смотрел я как-то видосик на ютубе и писал код. Потом долго разбирался, рисовал на листике и т.д. делал всё, что бы понять, почему в коде, y...

Объясните мне пожалуйста строчку в коде
Здравствуйте! Объясните мне пожалуйста 14 строчку в коде. Когда она срабатывает? Когда в result false? public bool tryQ(int i) ...

6
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
20.06.2013, 22:23
dalay_lama, apply принимает вторым аргументом массив и передает его функции, методом которой вызван, как набор аргументов (a,b, c, ...). А первым аргументом — да, принимает контекст.
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.06.2013, 03:51  [ТС]
Всё равно не могу понять, если он "принимает вторым аргументом массив и передает его функции", но мы то передаём объект?
0
Просто любитель
 Аватар для GuardCat
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
21.06.2013, 06:55
@dalay_lama, верно, не Array передаем. Но arguments во многом ведет себя как массив, apply в данном слуае разницы не видит.
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.06.2013, 14:02  [ТС]
кажется более менее понял. Поправьте меня пожалуйста если я не прав - это похоже на то, как в учебнике показывалось, метод обозвали - "одалживание метода", и в пример приводили как можно объекту arguments, добавить метод объекта array. вот пример: arguments.join = [].join; теперь у arguments есть метод join, т.к. join использует только элементы массива [1],[2]... и свойство length, то arguments может использовать этот метод. Аналагично с методом apply, я правильно понимаю? а можно ли где-нибудь посмотреть реализацию метода apply?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
21.06.2013, 17:52
имеем два объекта - AAA и BBB
у первого объекта есть свойство AAA.prop = true; а у второго такого свойства не определено

имеем функцию myFunc (), внутри которой проверяем истинность/ложность свойства this.prop
если такое свойство существует (и определено истинным), то страница станет красной
если же такого свойства не существует, то страница станет синей

1. запускаем функцию просто так (имя и круглые скобки)
this тогда будет текущим окном, у которого нет свойства prop - окно синее

2. запускаем функцию посредством метода apply и передаём ей объект AAA
this станет объектом AAA, и раз свойство prop у него имеется, то страница станет красной

3. запускаем функцию посредством метода apply и передаём ей объект BBB
this станет объектом BBB, свойства prop у которого нет, страница снова станет синей

4. запускаем функцию посредством метода apply и передаём ей объект null
this станет текущим окном, свойства prop у которого нет, страница будет синей

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script>
var AAA = new Array (); // ìîæíî è new Object () - ýòî áåç ðàçíèöû
    AAA.prop = true;
var BBB = new Array (); // è çäåñü ìîæíî new Object () - îäíîñòðóéíî
 
function myFunc ()
{
document.body.style.background = this.prop ? 'red' : 'aqua';
document.getElementById ('inf').value = this.prop;
}
</script>
 
<body>
<p><input type="button" value="1 -- myFunc ()" onclick="myFunc ()">
<p><input type="button" value="2 -- myFunc.apply (AAA)" onclick="myFunc.apply (AAA)">
<p><input type="button" value="3 -- myFunc.apply (BBB)" onclick="myFunc.apply (BBB)">
<p><input type="button" value="4 -- myFunc.apply (null)" onclick="myFunc.apply (null)">
 
<hr><input id="inf">
</body>
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
22.06.2013, 04:06  [ТС]
большое спасибо за объеснение. Но я не много не об этом спросил. То что вы описали я уже понимал, более или менее, но теперь хорошо это понимаю) у меня именно не укладывается в голове то, что apply передаёт массив, но при этом, передача ОБЪЕКТА arguments срабатывает. После ответа @GuardCat, я вроде бы уловил, и хотел узнать правильно ли я понял или нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2013, 04:06
Помогаю со студенческими работами здесь

объясните пожалуйста ошибку в коде mfs
делала лабу по методичке, перепроверила 100 раз, находит ошибку void CP1Dlg::OnBnClickedP1Dialog() { // TODO: Add your control...

Объясните пожалуйста значения каждой строчки в коде
Код в AVR studio, цель: вывести c помощью микроконтроллера на экран слово fantasy #include &lt;avr/io.h&gt; #define FOSC 8000000 ...

Объясните строку в коде
Здравствуйте. Написал программу для нахождения корня методом золотого сечения. Меня интересует 1 вопрос в самом методе: строка if...

Объясните строку в коде
Есть код, изучаю конструкторы, объясните что делает строчка Distance(int ft, float in) : feet(ft), inches(in) сижу уже пару...

Объясните строку в коде
привет, здесь кусок кода с моими комментами и в конце вопрос. Пожалуйста объясните почему и зачем. bool start = true; //...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
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 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru