(function(f){
window.setTimeout =f(window.setTimeout);
window.setInterval =f(window.setInterval);
})(function(f){return function(c,t){var a=[].slice.call(arguments,2);return f(function(){c.apply(this,a)},t)}});
另外请问下:window.setTimeout(function(){
alert(arguments.length);//为什么Firefox下为是4,最后一个参数不知道是什么??
},1,"a","b","s");
<script type="text/javascript">
(function(f){
window.setTimeout =f(window.setTimeout);
window.setInterval =f(window.setInterval);
})(function(f){
return function(c,t){
var a=[].slice.call(arguments,2);
return f(function(){
c.apply(this,a)
},t)
}
});
</script>
<script type="text/javascript">
window.setTimeout(function(){
for(var i = 0; i < arguments.length; i++){
alert(arguments[i]);
}//为什么Firefox下为是4,最后一个参数不知道是什么??
},1,"a","b","s");
</script>
最后一个是37~·不清楚是什么
<script type="text/javascript">
(function(f){
window.setTimeout =f(window.setTimeout);
window.setInterval =f(window.setInterval);
})(function(f){
return function(c,t){
var a=[].slice.call(arguments,2);
return f(function(){
c.apply(this,a)
},t)
}
});
</script>
最外层是一个闭包
(function(f//这个f就是形参){
//这里是函数的主体
window.setTimeout =f(window.setTimeout);//主句话就好比这样
window.setTimeout = function(window.setTimeout){
return function(c,t){
var a=[].slice.call(arguments,2); //把c,t组成数组
return f(function(){ //这是返回一个闭包,但是没有执行
c.apply(this,a) //c就好比是咱们的a()函数方法,apply是自掉方法.把数组a传进去
},t//是执行时间)
}
}
})(function(f){ //最外层是一个匿名函数,当实参传给函数,就是那个形参f
return function(c,t){
var a=[].slice.call(arguments,2);
return f(function(){
c.apply(this,a)
},t)
}
})
当最外面调用window.setTimeout时,传给它一个c,一个t
c就好比是函数方法~·如
function a(){
alert('你好');
}
window.setTimeout(a//把方法a传进去,t//就是时间)()//返回闭包,加上()执行;
为什么运行这个之后alert(window.setTimeout);和alert(setTimeout);不一样了呢?setTimeout不是window下面的一个函数吗?为什么加上window.setTimeout=function(){}无法将其覆盖?
因为你运行完作用域链上就有window.setTimeout了~·这样访问setTimeout是访问window的~·可作用域链会先找到~·你执行后的window.setTimeout~`为什么加上window.setTimeout=function(){}无法将其覆盖?如果你想覆盖就得用原型~·prototype
window.prototype.setTimeout = function(){};这样写才能覆盖~··