caller和callee的解析与使用-型参与实参的访问

本文详细解析了JavaScript中caller和callee属性的作用与使用方法。caller属性可以获取到调用当前函数的函数引用,而callee属性则指向正在执行的函数本身。通过实例演示了如何利用这两个属性来了解函数调用栈及递归调用的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

caller:是一个函数引用(当前执行函数”被调用的地方”{即这个”被调用的地方”函数引用},如果这个”被调用的地方”是window,则返回【null】),是函数名的属性;

var a = function() {   
alert(a.caller);      //输出:var b = function() {a();}
}   
var b = function() {   
a();   
}   
b();  

callee:返回当前执行函数本身,是arguments的属性。

var a = function() {   
alert(arguments.callee);  //输出:function() {alert(arguments.callee);}
}  

型参与实参的访问

function fn(a,b,c){
    console.log(fn.length);                //型参:输出3
    console.log(arguments.callee.length);  //型参:输出3   【匿名函数的用法】
    console.log(arguments.length);         //实参:输出2
}

fn(1,2);

参考来源:http://blog.youkuaiyun.com/laijieyao/article/details/43404953

<think>好的,我现在需要回答用户关于ARM64架构中callercallee寄存器的使用问题,并且要求结合DeepSeek模进行回答。首先,我需要回顾ARM64的寄存器分类使用规则,确保自己理解正确。 根据引用[3],ARM64有31个通用寄存器,分为X0-X30(64位)W0-W30(32位)。引用[4]提到,X0-X18是caller-saved,即调用者在调用函数前需要保存这些寄存器,如果调用后还需要使用它们的值的话。而X19-X29是callee-saved,被调用函数在使用这些寄存器前必须先保存,返回前恢复。这确保了函数调用时寄存器的值不会意外丢失。 接下来,用户还希望了解如何用DeepSeek模进行回答。DeepSeek可能是一个AI模,擅长处理结构化信息。我需要说明如何将上述知识通过DeepSeek生成,比如输入问题后,模解析并引用相关资料,最后组织成用户友好的回答。 在组织回答时,要分点清晰,先解释概念,再举例说明,最后结合DeepSeek的应用。同时,需要确保引用正确,每个引用的内容在回答中标明对应的来源。例如,caller-saved的规则在引用[4]中,callee-saved在引用[3][4]都有提到。 另外,用户提供的引用中有关于寄存器的位数保存责任的具体描述,需要准确引用这些信息,避免错误。比如,X0-X7用于参数传递返回值,这在函数调用中很关键,必须指出。 最后,生成的相关问题需要主题相关,可能涉及寄存器使用规则、优化方法或实际应用场景,确保问题有助于进一步学习。 现在检查是否有遗漏或错误。比如,确认callercallee寄存器的分类是否正确,是否覆盖了所有相关引用内容。同时,确保示例代码或场景正确,比如函数调用中寄存器的保存恢复步骤是否符合规范。 总结下来,回答的结构应该是:介绍概念,详细分类callercallee寄存器,使用示例,结合DeepSeek的回答方法,最后相关问题。需要保持语言简洁,符合用户要求的中文回答,并正确应用引用标注。</think>### ARM64架构中CallerCallee寄存器的使用 #### 1. **基本概念** 在ARM64架构中,**Caller-saved寄存器**(调用者保存)**Callee-saved寄存器**(被调用者保存)是函数调用时寄存器管理的核心规则,用于确保数据在函数调用前后的正确性[^4]。 #### 2. **寄存器分类** - **Caller-saved寄存器(X0-X18)** - **用途**:临时存储数据,调用者在调用函数前需自行保存这些寄存器的值(若调用后仍需使用)。 - **典场景**:函数参数传递(X0-X7)、返回值(X0)临时计算[^3]。 - **示例**:若函数A调用函数B时使用了X1寄存器,函数A需在调用前将X1的值压入栈,调用结束后恢复。 - **Callee-saved寄存器(X19-X29)** - **用途**:长期存储数据,被调用函数在使用前需先保存这些寄存器的值,返回前恢复原值。 - **典场景**:保存函数执行上下文(如循环计数器、指针等)。 - **示例**:函数B若使用X20寄存器,需在入口处保存X20到栈中,退出前从栈中恢复。 #### 3. **使用示例** 假设函数`func1`调用`func2`: ```asm // func1(Caller) 保存 X0-X18(若需要) → 调用 func2 → 恢复 X0-X18(若需要) // func2(Callee) 保存 X19-X29(若使用) → 执行操作 → 恢复 X19-X29 → 返回 ``` #### 4. **结合DeepSeek模的回答方法** DeepSeek模通过以下步骤生成答案: 1. **解析问题**:识别关键词如“ARM64”、“Caller/Callee寄存器”。 2. **检索知识**:结合引用[3]中的寄存器规则调用约定。 3. **结构化输出**:按概念、分类、示例组织内容,确保符合技术文档规范。 4. **验证逻辑**:检查寄存器分类是否ARM官方手册一致(如X0-X18为Caller-saved)。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值