javascript 中递归的使用也是常见的.比如遍历DOM树.
在我们熟悉的js框架(jQuery,prototype等)中都有递归的身影.
Mixin在很多语言里都有实现,对于动态的javascript实现更是简单,只不过是成员赋值就行了.
那么这两者有什么联系?兼容又从何而来?
代码说话:
function foo1(c){
alert(c+a +':'+(this.constructor));//这里的信息足以说明不同了
a++;
if (a>1) return;//跳出递归
foo1(c);//直接递归
}
function foo2(c){
alert(c+a +':'+(this.constructor));//这里的信息足以说明不同了
a++;
if (a>1) return;//跳出递归
arguments.callee.apply(this,arguments);//兼容Mixin的递归
}
var a=0;//为了跳出递归设置的变量
foo1('foo1:');
var a=0;
foo2('foo2:');
var f={};
f.ff=foo1;//这就是javascript最简单形式的Mixin了
var a=0;
f.ff('foo1Mixin:');
f.ff=foo2;
var a=0;
f.ff('foo2Mixin:');
分享到:
相关推荐
4. **ES6的箭头函数**:箭头函数没有自己的`this`、`arguments`、`.call`、`.apply`和`.constructor`等方法,因此它们无法使用`arguments.callee`。在ES6中,通常建议使用`let`或`const`来声明一个内部函数,然后...
这个特性在现代JavaScript编程中已经不推荐使用,但在老旧的代码中还是可以看到它的影子,特别是在使用递归调用函数时,arguments.callee可以用来引用函数自身,无需使用函数名。 在介绍arguments.callee的应用之前...
在JavaScript中,`arguments` 和 `arguments.callee` 都是与函数参数相关的特殊对象,但它们的作用和用途略有不同。下面将详细解释这两个概念及其区别。 `arguments` 对象是一个类数组对象,它包含了函数调用时传入...
这样一来,即使fac函数名被重新赋值为另一个函数,arguments.callee仍然能够引用到原来的递归函数,使得递归调用可以正常工作。具体来说,arguments.callee(num-1)能够继续递归地计算阶乘,即使fac已经被覆盖。 在...
总的来说,虽然`arguments.callee`在过去的JavaScript开发中起到了重要作用,但随着语言的进化,开发者应逐渐适应不依赖`arguments.callee`的编程风格,充分利用ES6及更高版本提供的新特性,编写更加高效、简洁的...
这意味着你可以通过`arguments.callee`来引用调用函数,这对于匿名函数或者递归调用非常有用,因为匿名函数没有名字,无法直接引用自身。 ```javascript (function sum(n) { if (n === 1) return 1; return n + ...
然而,由于这种用法可能导致难以调试的代码,ES5严格模式下会禁止使用arguments.callee。 4. **apply方法** apply是Function对象的一个方法,允许改变函数调用的上下文(即this值)以及传入参数。它接受两个参数:...
标题 "解析 this.initialize.apply(this, arguments)" 涉及到的是JavaScript编程中的一个关键概念,尤其是在对象构造和类继承的情景下。`this` 关键字在JavaScript中扮演着核心角色,它指的是函数调用时的上下文,而...
在JavaScript编程中,arguments、caller和callee是函数对象自带的三个隐含参数,它们为开发者提供了额外的函数执行信息,尤其在处理函数参数、递归调用以及调用栈追踪时非常有用。下面详细介绍这些隐含参数的使用...
以下是一个使用`arguments.callee`实现递归的例子: ```javascript function sum(num) { if (num ) { return 1; } else { console.log(num, arguments.callee(num - 1)); return num * arguments.callee(num -...
JavaScript中的`arguments`对象是一个...通过`arguments.length`可以获取参数个数,通过索引访问参数值,以及利用`arguments.callee`实现递归等功能。在编写函数时,善用`arguments`可以使代码更具灵活性和可扩展性。
例如,在匿名递归函数中,你可以通过arguments.callee来避免因函数名改变而需要修改递归调用的地方。但是,在ECMAScript 5的严格模式中,对arguments.callee的引用也是不允许的,使用时也会抛出TypeError。 在实际...
2. **`length`属性**:`arguments.length`返回传递给函数的实际参数数量。 3. **动态性**:即使函数定义时没有指定参数,`arguments`也可以捕获所有传入的参数。 #### caller属性:追踪函数调用链 `caller`属性...
// 在旧版本浏览器中,arguments.callee会指向这个匿名函数 ``` 接下来,我们讨论`call`和`apply`,它们是JavaScript中函数调用的两种特殊方式。`call`和`apply`的主要区别在于传递参数的方式:`call`接受一个参数...
匿名递归主要通过`arguments.callee`属性来实现,但在现代JavaScript中,应尽可能避免使用这一非标准特性,转而采用更现代的解决方案,如闭包和`self`引用。理解这些递归技巧对于提升JavaScript编程能力非常重要。