// Создать функцию work, что она делает понятно, надеюсь
function work(a, b) {
alert( a + b );
}
// Создать функцию spy, которая принимает в себя функцию
function spy(func) {
// Создать функцию-обертку, которая принимает в себя все аргументы
// функции, внутри которой она была вызвана.
function wrapper(...args) {
// Сохранить аргументы внутри wrapper.calls
wrapper.calls.push(args);
// Привязать функцию, что передавалась как агрумент,
// к контексту, в котором она будет вызвана
return func.apply(this, arguments);
}
// Вот тут начинается полный говнокод.
// То, что написано снизу, равноценно следующему:
// var wrapper;
// wrapper.calls = [];
// Почему говнокод? Потому что во первых никто
// давно в 2020 году не пользуется var. А почему?
// А потому что эта переменная будет висеть на общее обозрение.
// Никогда не надо делать так, объявляйте нормально:
// const wrapper или let wrapper. Более того, не понятно,
// зачем здесь нужен именно wrapper.calls. Можно просто создать
// переменную const wrapper = [] и пушить в неё.
wrapper.calls = [];
// Собственно вернуть то что получилось.
return wrapper;
}
// Снова говнокод. По итогу теперь work = wrapper, у которого определен
// метод func как function func(a, b) { alert(a+b) }. work что объявлен в самом начале исчез.
work = spy(work);
// Здесь вызывается то что получилось.
work(1, 2); // 3
work(4, 5); // 9
// Тут выводятся значения из массива, всё понятно
for (let args of work.calls) {
alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
const argumentsArray = [];
function work(a, b) {
console.log(a + b);
}
function loggedArgs(...args) {
argumentsArray.push(args);
}
function workAndLog() {
work(...arguments);
loggedArgs(...arguments);
}
workAndLog(1, 2); // 3
workAndLog(4, 5); // 9
for (let args of argumentsArray) {
console.log("call:" + args.join()); // "call:1,2", "call:4,5"
}
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_include mime ^application/javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
<ifModule mod_headers.c>
<filesMatch "\.(ico|jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "public"
</filesMatch>
<filesMatch "\.(css)$">
Header set Cache-Control "public"
</filesMatch>
<filesMatch "\.(js)$">
Header set Cache-Control "public"
</filesMatch>
<filesMatch "\.(x?html?|php)$">
Header set Cache-Control "private, must-revalidate"
</filesMatch>
</ifModule>
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access 7 days"
ExpiresByType image/x-icon "access plus 6 month"
ExpiresByType image/jpeg "access plus 6 month"
ExpiresByType image/jpg "access plus 6 month"
ExpiresByType image/png "access plus 6 month"
ExpiresByType image/gif "access plus 6 month"
ExpiresByType application/x-shockwave-flash "access plus 6 month"
ExpiresByType text/css "access plus 7504800 seconds"
ExpiresByType text/javascript "access plus 7516000 seconds"
ExpiresByType application/javascript "access plus 7516000 seconds"
ExpiresByType application/x-javascript "access plus 7516000 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>