Зачем в функцию передаются следующие аргументы: window, document, undefined?
1) Код оборачивается в функцию, чтобы изолировать область видимости переменных
2) переменные window, document, undefined передаются в функцию, чтобы она лучше минифицировалась. После прогона минификатором этот код превратится в (function(w, d, u) {
    // что-нибудь происходит и возвращается значение
})(window, document);
и все внутренние обращения к window, document и undefined будут заменены на обращение к w, d и u.
1) Код оборачивается в функцию, чтобы изолировать область видимости переменных
2) переменные window, document, undefined передаются в функцию, чтобы она лучше минифицировалась. После прогона минификатором этот код превратится в (function(w, d, u) {
    // что-нибудь происходит и возвращается значение
})(window, document);
и все внутренние обращения к window, document и undefined будут заменены на обращение к w, d и u.