Прежде всего, отличный вопрос! Я потратил как минимум час, пытаясь придумать относительно простой способ его реализации! Вот как я решил эту проблему:
Object.prototype.yield = function() {
return "try { (" + this + ")() } catch (e) { console.log('**Context error** ' + e) }";
}
// first yielding block
var y1 = (Object(function() {
console.log('in y1, but still in the right context...');
a++;
})).yield();
// second yielding block
var y2 = (Object(function() {
console.log('in y2, but still in the right context...');
a = a + 5;
})).yield();
// voila
(function() {
var a = 1;
eval(y1);
eval(y2);
a--;
eval(y2);
console.log(a); // a == 11 now as expected
})();
// another block without an `a`
(function() {
var b = 1;
eval(y1); // gracefully fails
})();
Это имеет тенденцию быть немного более рубиновым в том смысле, что он может давать в нескольких местах. Не только это, но это еще один шаг вперед, поскольку он может передавать определенные блоки кода (y1
, y2
, y3
и т. Д.)
Надеюсь, этот ответ был полезен, ваш вопрос был замечательным!