gpt4 book ai didi

Javascript argument.callee 的用途是什么

转载 作者:行者123 更新时间:2023-12-03 02:21:59 25 4
gpt4 key购买 nike

我还没有找到这个变量的任何完整的跨浏览器文档。

什么是arguments.callee为了?它是如何工作的?

它有哪些参数?

最佳答案

arguments.callee 是对当前正在调用的函数的引用。首先,不要使用它:如果您处于严格的上下文中,它只会抛出错误。

但是,就个人而言 - 并且 I'm not alone in this - 我会想念这个属性(property)的。在解释原因之前,我将给您一个伪示例,说明您何时可以使用此功能:

var looper = (function(someClosureVar)
{
setTimeout((function(resetTimeout)
{
return function()
{
//do stuff, stop OR:
resetTimeout();
};
}(arguments.callee)),1000);
}(document.getElementById('foobar')));

我希望你喜欢闭包,因为我喜欢 - 这就是 arguments.callee 很可能发生的地方。倒数第二行是钱所在的地方:

(arguments.callee)

是对匿名函数的引用,该函数在闭包范围内设置初始超时(在本例中可以访问 1 个 DOM 元素)。匿名函数在返回后会被 GC,但在本例中,我已将其添加到超时回调的作用域中(将其作为参数传递给返回实际回调的另一个匿名函数),因此它仍然在某处被引用。
现在,如果您处于严格模式,则不必担心,因为这就是严格模式下的代码:

var looper = (function tempName(someClosureVar)
{
setTimeout((function(resetTimeout)
{
return function()
{
//do stuff, stop OR:
resetTimeout();
};
}(tempName)),1000);
}(document.getElementById('foobar')));

为该函数命名即可。为什么我不喜欢它? arguments.callee 会引发标志,就像正在进行某些闭包欺骗的匿名函数一样。我想这只是一种习惯,但我觉得它可以帮助我更轻松地构建和调试我的代码。
再加上对 IE 的病态仇恨,这对于任何从事客户端脚本编写的人来说都是很自然的。不支持严格模式的 IE 版本往往会将函数名称泄漏到全局命名空间,因此永远不允许与函数(以及我们创建的闭包)关联的内存被 GC ”编辑。这可能会导致循环引用,更糟糕的是,循环 DOM 引用可能会导致内存泄漏。

实际上:here's another, real example使用 arguments.callee 的位置:事件委托(delegate)和分离事件监听器
here's some more info使用 arguments.callee 进行 JS 严格模式和递归。

最后一个问题是,IMO 最清楚地说明了 arguments.callee 如何方便:递归替换函数:

function someF(foo)
{
//'use strict'; <-- would throw errors here
foo = foo.replace(/(a|b)+/gi, function (p1,p2)
{
if (p1.match(/(a|b){2,}/i))
{
return p1.replace(/(a|b)/gi,arguments.callee);//recursive
}
return (p2.match(/a/i) ? 'X':'Y');
});
}

根据要求arguments.callee在 MDN 上,对严格模式下的使用发出警告(ECMA 5,这解释了为什么 DC 说 Arguments.callee 已弃用)
以及 more on strict

关于Javascript argument.callee 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com