
JavaScript
84
Вклад в тег
The main event loop is single-threaded but most of the I/O works run on separate threads, because the I/O APIs in Node.js are asynchronous/non-blocking by design, in order to accommodate the event loop.
Я подвис, но мой ответ был, что JS можно считать многопоточным и я так предполагаю из-за наличия xmlhttprequest запросов (в простонародии ajax).- строго говоря это не так. Хотя мне кажется это не далеко от истины. Если мы поговорим, что язык многопоточный, я думаю мы имеем ввиду, что языком поддерживается работа с потоками, а не то как он устроен изнутри или как изнутри устроена среда его исполнения. Потому как какая-нибудь сборка мусора может выполняться в отдельном потоке, но это не делает сам ЯЗЫК много поточным.
Вопрос: Относится ли WebAPI к движку JavaScript и корректно ли утверждать, что фактически xmlhttprequest выполняется в отдельном потоке от остального кода JavaScript?
if (![10, 9, 8].includes(8)) ...
if ((8 == 10 || 8 == 9 || 8 == 8) === false) ...
// для адекватности примера заменил 8 на x
if ((x === 10 || x === 9 || x === 8) === false) ...
if (!(x === 10 || x === 9 || x === 8)) ...
Стоит оговориться, что строго говоря такую функцию в данном виде написать нельзя, потому как при вызове функции переменная уже должна быть "разименована", а значит мы так или иначе будем работать с ее значением или с какими-то косвенными сайд эффектами вызванными обращением к ней.
isExists(() => someVar); // такая будет сигнатура
function isExists(someVarFn){
try {
someVarFn();
} catch(e) {
if (e instanceof ReferenceError) {
return false;
}
throw e;
}
return true;
}
function f1() {
let x;
console.log(isExists(() => x)); // => true
console.log(isExists(() => y)); // => false
}
function f2() {
let x;
console.log(isExists(() => x)); // => true
console.log(isExists(() => y)); // => false
}
f1();
f2();
function isExists(varName, fn){
return fn(`(()=>{
try {
const nop = ${varName};
} catch(e) {
if (e instanceof ReferenceError) {
return false;
}
throw e;
}
return true;
})()`);
}
function f1() {
let x;
console.log( isExists('x', c => eval(c)) ); // => true
console.log( isExists('y', c => eval(c)) ); // => false
}
function f2() {
let y;
console.log( isExists('x', c => eval(c)) ); // => false
console.log( isExists('y', c => eval(c)) ); // => true
}
f1();
f2();
const pseudoUndefined = {};
const scopeTrap = new Proxy(window, {
has() {return true},
get(target, prop) {
if (prop in window) {
return window[prop];
} else {
return pseudoUndefined;
}
}
})
function isExists(someVar) {
return someVar !== pseudoUndefined;
}
// весь код использующий функцию должен быть обернут в такой with :(
with (scopeTrap) {
let y;
console.log( isExists(x) ); // => false
console.log( isExists(y) ); // => true
}