随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

javascript函数具有很多特性,除了面向对象的部分之外(这在后面讲述),它自
已的一些独特特性应用也很广泛。

首先javascript中的每个函数,在调用过程中可以执有一个arguments对象。这个
对象是由脚本解释环境创建的,你没有别的方法来自己创建一个arguments对象。

arguments可以看成一个数组:它有length属性,并可以通过arguments[n]的方式
来访问每一个参数。然而它最重要的,却是可以通过 callee 属性来得到正在执行
的函数对象的引用。

接下的问题变得很有趣:Function对象有一个 caller 属性,指向正在调用当前
函数的父函数对象的引用。

——我们已经看到,我们可以在JavaScript里面,通过callee/caller来遍历执行
期的调用栈。由于arguments事实上也是Function的一个属性,因此我们事实上也
能遍历执行期调用栈上的每一个函数的参数。下面的代码是一个简单的示例:

<script language= "javascript" >
//---------------------------------------------------------
// 调用栈的遍历
//---------------------------------------------------------
function foo1(v1, v2) {
  foo2(v1 
* 100);
}

function foo2(v1) {
  foo3(v1 
* 200);
}

function foo3(v1) {
  var foo 
= arguments.callee;
  
while (foo && (foo != window)) {
    document.writeln(
'调用参数:<br>''---------------<br>');

    var args 
= foo.arguments, argn = args.length;
    
for (var i=0; i<argn; i++) {
      document.writeln(
'args[', i, ']: ', args[i], '<br>');
    }
    document.writeln(
'<br>');

    
// 上一级
    foo = foo.caller;
  }
}

foo1( 
100200 );
执行的结果是:
调用参数:
---------------
args[
0]: 2000000

调用参数:
---------------
args[
0]: 10000

调用参数:
---------------
args[
0]: 100
args[
1]: 200
posted on   今夜太冷  阅读(527)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示