The use of:
var MyClass = (function (window, document, Math, undefined) {
...
})(window, document, Math, undefined);
is misguided. If the intention is to get "safe" access to native methods, then it will fail if those identifiers have already been assigned new values before the code runs.
The best you can do is:
var myClass = function(global) {
// In here you can be certain that global references the global (window) object
var window = global;
// and that the value of undefined will be undefined
var undefined;
// But you are still uncertain of
var document = window.document;
var Math = window.Math;
...
// guaranteed access to the global object
}(this));
The value of this can't be overwritten in any context (though it can be set on entering a function by the call or with bind), so in the global execution context it must reference the original global object. But the Math and window properties may have been reassigned, you can't stop that (though a future version of ECMAScript may make it impossible in certain circumstances).
So if the IIFE must run before the properties of interest have been reassigned, then creating aliases does nothing of value. Though as others have said, it may help in minification.
Note that creating aliases of host objects and methods is problematic, e.g.
var getEl = document.getElementById;
var el = getEl('foo');
may well throw an error as the getElementById function may expect to be called as a method of document and therefore its this may not be set correctly.