Приведенный ниже код отлично работает в Firefox, в Chrome он ведет себя довольно странно. Для коротких петель (менее нескольких сотен) это работает, но для больших никогда не заканчивается. Иногда он может выйти из этого бесконечного цикла и завершиться.
Это можно исправить, заменив «delete _scope.context» на _scope.context=undefined.
Может кто-нибудь уточнить, что здесь происходит?
(function() {
var _module = function() {
const _scope = function() {
var a = 0,
block = 0;
var suspend = function() {
var context = {};
context.a = a;
context.block = block;
context.resume = function() {
_scope.context = context;
return _scope();
}
_scope.context = context;
return context;
}
var awake = function() {
context = _scope.context;
delete _scope.context;
//_scope.context = undefined;
a = context.a;
block = context.block;
}
if (_scope.context !== undefined) {
awake();
}
while (true) {
switch (block) {
case 0:
block = 1;
return suspend();
case 1:
block = 0;
if (a++ > 10000) {
return;
}
continue;
}
}
}
return _scope();
}
var runMod = function() {
var susp = _module();
var nSteps = 0;
while (susp) {
susp = susp.resume();
if (!(++nSteps % 1000)) {
console.log(nSteps, susp);
}
if (nSteps > 100000) {
console.log('aborted')
break;
}
}
console.log('complete', nSteps);
}
runMod();
})()
.as-console-wrapper {
max-height: 100% !important;
}
Я тоже на неактуальном хроме (74) и вижу разницу между двумя
Чтобы уточнить, я добавил вменяемую проверку, и программа останавливается после ненормального количества шагов. Если вы видите «прервано» в консоли, значит, что-то пошло не так
Я использую Chrome 74.0.3729.157, обновленный
Это ошибка в Chrome, будет исправлена в 75 Исправление https://chromium-review.googlesource.com/c/v8/v8/+/1617251/6/src/runtime/runtime-object.cc#84
У меня вроде нормально работает? Возможно, вы все еще используете более старую версию Chrome.