<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>
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()函数对于闭包的作用你自己研究