<script type="text/javascript">
if ("function" != typeof Function.prototype.apply) {
//如果浏览器版本过低不支持apply和call的话 - -!
    Function.prototype.apply = function (obj, argu) {
    //apply函数兼容
        var a = [], f = null, i = 0;
        if (argu && argu.constructor === Array) for (; i < argu.length ; i ++) a[i] = "argu[" + i + "]";
        //把这个被apply的函数追到自己的原型对象中,这样就调用一下这个函数,就可以实现继承里面所有的引用。
        if (obj) obj.constructor.prototype.___caller = this;
        f = eval((obj ? "obj.___caller" : "this") + "(" + a.join(",") + ");");
        //用完了,就删除掉它
        if (obj) delete obj.constructor.prototype.___caller;
        return f;
    };
    Function.prototype.call = function (obj) {
    //call函数兼容
        for (var a = [], i = 1 ; i < arguments.length ; i ++) a[i - 1] = arguments[i];
        return this.apply(obj, a);
    };
}
</script>

解决方案 »

  1.   

    基本都已经标注了主要思想
     if (argu && argu.constructor === Array) for (; i < argu.length ; i ++) a[i] = "argu[" + i + "]";//将参数存到数组里
    if (obj) obj.constructor.prototype.___caller = this;//主要代码:将当前函数this变成obj所指对象__caller
     f = eval((obj ? "obj.___caller" : "this") + "(" + a.join(",") + ");");//主要代码:将参数拼接成代码文本然后用eval()函数执行
                                                                                      //至于eval()函数对于闭包的作用你自己研究