alu*_*umb 9 javascript overriding global settimeout
我试图将自己的错误处理添加到JavaScript setTimeout函数.以下代码在chrome中工作正常:
var oldSetTimeout = window.setTimeout;
window.setTimeout = function setTimeout(func, delay) {
var args = Array.prototype.slice.call(arguments, 0);
args[0] = function timeoutFunction() {
var timeoutArgs = Array.prototype.slice.call(arguments, 0);
try {
func.apply(this,timeoutArgs);
}
catch (exception) {
//Do Error Handling
}
}
return oldSetTimeout.apply(this, args);
}
Run Code Online (Sandbox Code Playgroud)
但在IE7中它变成了一个递归函数.由于某种原因oldSetTimeout设置为新功能.
有什么建议?
Tim*_*own 18
这是因为您正在使用在IE中错误实现的命名函数表达式.删除功能名称将解决紧急问题.看看kangax 关于这个主题的优秀文章.但是,还有一个问题不容易解决.
通常,尝试覆盖宿主对象(例如window,document或任何DOM元素)的属性并不是一个好主意,因为不能保证环境允许它.主机对象不受与本机对象相同的规则的约束,实质上可以做他们喜欢的事情.也不能保证宿主方法是一个Function对象,因此oldSetTimeout可能没有总是有apply()方法.这是IE的情况,所以调用oldSetTimeout.apply(this, args);不起作用.
我建议以下内容:
window.oldSetTimeout = window.setTimeout;
window.setTimeout = function(func, delay) {
return window.oldSetTimeout(function() {
try {
func();
}
catch (exception) {
//Do Error Handling
}
}, delay);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8951 次 |
| 最近记录: |