Оказывается eval.call(iframe, code) не дает полноценной области видимости, как надо. То есть в целом все ожидаемо и работает в области фрейма, но не видит глобальных переменных окна фрейма. Чтобы выполнялось как надо, надо вызывать
iframe.contentWindow.window.eval(code)