Javascript 访问eval';通过setInterval/setTimeout执行d代码

Javascript 访问eval';通过setInterval/setTimeout执行d代码,javascript,Javascript,我想知道我是否可以做一些清理程序,自动抓取超时/间隔。考虑这一点: var timeout = setInterval(function dimitar() { console.log("hi!"); }, 1000); console.log(window); 我通过窗口查看了一下,找不到任何对已传递函数的引用。对超时的引用确实存在。那么函数在这里的“活动”在哪里呢?是否启动了一个新的js解释器实例来评估/运行/保存代码?如何根据超时uid访问它 我知道我可以使用setInterv

我想知道我是否可以做一些清理程序,自动抓取超时/间隔。考虑这一点:

var timeout = setInterval(function dimitar() {
    console.log("hi!");
}, 1000);

console.log(window);
我通过窗口查看了一下,找不到任何对已传递函数的引用。对超时的引用确实存在。那么函数在这里的“活动”在哪里呢?是否启动了一个新的js解释器实例来评估/运行/保存代码?如何根据超时uid访问它


我知道我可以使用setInterval函数,让它始终将引用存储到一个数组中,然后我可以循环并清除该数组,但我想知道是否有一种自然的方法来实现这一点,您在示例中创建的函数使用的是命名函数表达式。该名称仅在函数中可用。否则,它的行为与匿名函数相同:您没有将其分配给变量,而且由于它不是函数声明,因此它不会在封闭范围内创建
dimitar
变量。以下文章可能有用:

没有
eval
-类型的事情发生:您刚刚将对函数的引用传递到
窗口。setInterval
。除非之前已将此函数分配给变量,或者它是对函数声明定义的函数的引用,否则以后无法检索此函数

如果要保留对函数的引用,只需先将其存储在变量中:

var dimitar = function() {
    console.log("hi!");
};

window.setInterval(dimitar, 1000);

您在示例中创建的函数使用命名函数表达式。该名称仅在函数中可用。否则,它的行为与匿名函数相同:您没有将其分配给变量,而且由于它不是函数声明,因此它不会在封闭范围内创建
dimitar
变量。以下文章可能有用:

没有
eval
-类型的事情发生:您刚刚将对函数的引用传递到
窗口。setInterval
。除非之前已将此函数分配给变量,或者它是对函数声明定义的函数的引用,否则以后无法检索此函数

如果要保留对函数的引用,只需先将其存储在变量中:

var dimitar = function() {
    console.log("hi!");
};

window.setInterval(dimitar, 1000);
那么函数在这里的“活动”在哪里呢

超时/间隔队列是内容JavaScript无法访问的内部实现细节。它保留对传递到
setInterval
的函数的引用,但它不是对您可见的引用

顺便说一句,您通常应该避免使用命名的内联函数表达式。虽然在这个示例代码中可能没有问题,但是IE的JScript中有一些严重的基本错误,如果不小心的话,这些错误可能会绊倒您。坚持使用命名函数语句(
function-dimitar(){…}…setInterval(dimitar,1000)
)或匿名内联函数表达式(
setInterval(function(){…})

是否启动了一个新的js解释器实例来评估/运行/保存代码

不,它是同一个解释器,队列甚至可以用JavaScript实现。但它背后的变量对调用方来说是隐藏的

如何根据超时uid访问它

超时ID在设计上是完全不透明的。唯一可以使用它做任何事情的定义接口是
clearTimeout
/
cleartimiod
调用。没有提供从超时ID获取函数的接口

那么函数在这里的“活动”在哪里呢

超时/间隔队列是内容JavaScript无法访问的内部实现细节。它保留对传递到
setInterval
的函数的引用,但它不是对您可见的引用

顺便说一句,您通常应该避免使用命名的内联函数表达式。虽然在这个示例代码中可能没有问题,但是IE的JScript中有一些严重的基本错误,如果不小心的话,这些错误可能会绊倒您。坚持使用命名函数语句(
function-dimitar(){…}…setInterval(dimitar,1000)
)或匿名内联函数表达式(
setInterval(function(){…})

是否启动了一个新的js解释器实例来评估/运行/保存代码

不,它是同一个解释器,队列甚至可以用JavaScript实现。但它背后的变量对调用方来说是隐藏的

如何根据超时uid访问它


超时ID在设计上是完全不透明的。唯一可以使用它做任何事情的定义接口是
clearTimeout
/
cleartimiod
调用。没有提供从超时ID获取函数的接口。

感谢您的解释,现在更清楚了-换句话说,我需要保留并清理引用。我只把命名函数dimitar放在那里,这样我就可以在firebug中搜索它了。就像在remove the timeouts
onunload
中一样,以避免内存泄漏?这应该只对IE6是必要的。(即使如此,我也不能完全确定超时是否会参与IE臭名昭著的本机/主机对象引用循环,还没有对其进行测试。)我只是在mootools中构建了它——是的,在我看来,避免由于可能一直运行的代码而导致的内存泄漏不是一个坏主意,尤其是对于IEthanks来说,现在更清楚了——换句话说,我需要保留和清理引用。我只把命名函数dimitar放在那里,这样我就可以在firebug中搜索它了。就像在remove the timeouts
onunload
中一样,以避免内存泄漏?这应该只对IE6是必要的。(即使这样,我也不能完全确定超时是否会参与IE臭名昭著的本机/主机对象引用循环,我还没有对其进行测试。)我只是在mootools中构建了它——是的,避免了内存不足