关于JS arguments.callee的问题

r13628692 2009-06-08 04:44:11
JS 中的arguments.callee 是什么呀 干什么用的
希望能举个简单的例子 谢谢了
...全文
247 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiezhilong167 2009-07-10
  • 打赏
  • 举报
回复
再给你一个例子吧
function Sing(){
with(arguments.callee)
alert(author+":"+poem);
}
Sing.author = "李白";
Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归";
Sing();
Sing.author = "李战";
Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,唱三千年";
Sing();
r13628692 2009-06-09
  • 打赏
  • 举报
回复
argument代表当前函数的参数数组
argument.callee代表当前的函数体(可以运用于递归操作)

<script language=javascript>
//可以利用argument.callee 做递归操作
function ShowArgument()
{
var length = arguments.length;
alert('当前函数参数数量:'+length+' 第三个参数是:'+arguments[2]+" 当前函数:"+arguments.callee.toString());

}
</script>
<input type=button id=btn1 onclick="javascript:ShowArgument(11,12,13,14,15);" value="Button1" />
根据原作 https://pan.quark.cn/s/18f433abd874 的源码改编 JavaScript中的`arguments.callee`被视为一个属性,它允许在函数内部引用当前正在执行的函数对象。 这一属性在处理函数递归、维护函数的封装性以及匿名函数进行自我引用等特定情况下显得特别有价值。 然而,考虑到`arguments`对象涉及相对较高的操作成本,每次函数递归时都需要重新构建,这可能在现代浏览器环境中引发性能问题,并对闭包的优化造成不利影响。 因此,从ES5规范开始,`arguments.callee`已被标记为非标准,且不鼓励在实际开发中使用。 ### `arguments.callee`的功能与应用1. **匿名函数的递归调用**:当函数没有被赋予明确的名字时,`arguments.callee`能够使函数调用自身,从而实现递归逻辑。 这对于编写需要递归机制的匿名函数来说非常实用,因为它消除了对函数名称的直接依赖。 2. **增强代码的封装效果**:`arguments.callee`能够使函数体内的代码与函数的名称分离,进而提升代码的封装程度。 即便函数的名称发生变化,只要在函数内部通过`arguments.callee`进行调用,函数仍能按预期执行。 3. **获取函数的引用**:`arguments.callee`提供了一个指向当前执行函数的引用,这在某些特定场景中需要获取函数本身时非常有用。 ### 替代`arguments.callee`的方案鉴于`arguments.callee`存在性能瓶颈且不被推荐使用,可以考虑以下几种替代方法:1. **为函数命名**:最直接的方法是在函数内部定义一个具有名称的函数,这样函数就可以通过这个名称来引用自身,完成递...

62,265

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧