Что значит void function?
Я знаю что значит void 0 (void условие), но не понимаю что значит void function. Что это значит и зачем это? Как это может использоваться с анонимными и обычными функциями? И я часто встречал примерно вот такие записи:
void function foo(){...}
void function(){...}
void function foo(){...}()
void function(){...}()
Ответы (1 шт):
Что это значит и зачем это?
Для рекурсивных функций, чтобы они помнили название самих себя, но не существовали.
var calls={max:4,now:0};
void function myFunc() {
++calls.now;
if (calls.now===calls.max) {
console.log(calls.now);
} else {
myFunc();
}
}()
console.log(typeof myFunc)
Собственно, в этом нет смысла, если оборачивать анонимную функцию в ;(function(){})(/*здесь вызов*/);, но там это делается дольше, как в последней иллюстрации;
Аналоги(?), подробнее:
//напишите 'use strict' и уберите ';' для ошибки
//явно нужно указать var=(эта функция)() для получения обработки;
;(()=>{
//стрелочные функции плохая практика (здесь)
//т.к. в случае сниппетов урезан arguments
return null;
})(); //по той же причине, что и 'use strict' здесь ';'
Нагляднее:
;(function(){
for (var insecVarIfSnippetWhenConstUsing of Array.from(arguments)) {
if (typeof insecVarIfSnippetWhenConstUsing!='number') throw(`only numbers`);
}
return {then(x){console.log(x)}};
})(2,'эта строка спровоцирует ошибку').then('Hello, World!');
Пример для, видимо, генеративного программирования.
Однако возникает вопрос касательно рекурсии (мы же "типа защищаем" переменные):
//намеренно вычурный пример
;(function(noConstForRecursive){
doRecursive=Object.assign(true, {max:4, arr:[]});
function noConstForRecursive(arg){
if (arguments.length!=0) {
doRecursive.arr.push(arg);
}
doRecursive=Object.assign((doRecursive.max>doRecursive.arr.length), doRecursive);
if (doRecursive==true) { //наглядный пример == против ===, к слову
noConstForRecursive(Math.random());
}
if (arguments.length==0) return doRecursive.arr;
}
console.log(noConstForRecursive())
})();
Чтобы рекурсии делать красивее и нужен void в начале функции (чтобы не висело в памяти; собственно, отсюда мои предъявления const-пользователям становятся понятнее - <script></script> без блока внутри, объявивший const и вот +ещё одна проблема в коде).
? зачем: к примеру, инсталятор rust, а также прочие, его, файлы от своего названия меняют поведение. (популярный пример); если Ваши программы совместимы или имеет своё поведение для браузера, NodeJS (.load, eval(), mainModule (sig?), require()!=mainModule) и т.д., при том, безопасны (включительно, от const-пользователей (и без fork и scriptTag)), то, вероятно, это сниппеты такого типа:
Иллюстрации концепта, где скрипт узнаёт свою элевацию, модификацию (или Ctrl+C/V):
https://codeberg.org/slnknrr/js.nodejs21.snippets/src/branch/main/ssfindex224.js
(это сниппет и он в ленивой разработке)