В strict mode this должен по-умолчанию быть равен undefined. Только with там запрещён
"use strict";
alert( (function(){return this})() )
В хромиуме (и, вроде как, FF5) оно уже работает, но в Опере ещё нет.
А ещё есть такая хитрость:
function create_isolated_closure(func)
{
var global = (function(){return this;}).call(null);
var undefined;
// перекрываем абсолютно все что есть в global
var scope = {};
for(attr in global) {
scope[attr] = undefined;
}
delete scope.alert; // оставляем доступ к alert(), чтобы тестировать функции
with(scope)
return eval("(function () { 'use strict'; return ("+func.toString()+"); })()");
}
function test()
{
var w1 = (eval || eval)("this"),
w2 = (function(){return this})();
alert([w1, w2]);
}
var t = create_isolated_closure(test); // делаем изолированную копию функции
t.call({}); // вызов изолированной копии, DOM недоступен