Некое подобие “use strict” для node.js

by Michel Beloshitsky

Недавно в группе node.js был поднят вопрос о том, когда же появится обещаемый спецификацией ECMAScript 5 режим "use strict".

Проблема конечно насущная, учитывая особенностями обращения яваскрипта с глобальными переменными и использования прототипной модели. С другой стороны это как раз что-то из разряда “за что ненавидим, за то и любим”.

И насколько эта проблема насущная, настолько же и трудноразрешимая, потому что по этому поводу надо теребить разработчиков v8, а у них роадмап не располагает.

2010 – Q2 – Make V8 faster
2010 – Q3 – Make V8 faster
2010 – Q4 – Make V8 faster
2011 – Q1 – Make V8 faster
2011 – Q2 – Make V8 faster
2011 – Q3 – Release quantum entanglement device
2011 – Q4 – Make V8 faster
(источник)

У меня есть решение, в принципе выполняющее то, что от него нужно:

function strict (fun) {
   var sandbox = {}, err = null

   process.binding('evals').Script
        .runInNewContext('('+fun.toString()+')()',sandbox);

   /* Check sandbox for new members. Each of them is an error */
   for (err in sandbox)
      console.error('Undeclarated variable: '+ err)
   if (err)
      throw 'Strict mode violation'
}

Основную задачу – изоляцию кода от глобальных переменных он выполняет. Однако с недостатками:

  1. как видно из исходника проверка на объявление глобальных переменных осуществляется только после того, как весь код отработает. Вообще в асинхронном окружении node.js, где любой кусок кода должен выполняться за миллисекунды это не проблема. Но тем не менее, возможно это не достаточно надежно для конструкции языка, которая не должна закладываться на синхронность-асинхронность.
  2. 2) некие проблемы с взаимодействием с внешним кодом. Очень уж strict выходит.

Есть еще одно решение - мониторить объект global по таймеру в рантайме. Такое же, что и мое: не совсем академично (даже возможно забавно – по таймеру чекать глобалсы), но оно работает.