|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-07-01 关键字: mixin 递归
javascript 中递归的使用也是常见的.比如遍历DOM树. 在我们熟悉的js框架(jQuery,prototype等)中都有递归的身影. Minin在很多语言里都有实现,对于动态的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:');
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-07-01
其实这里的关键不在于apply,而在于arguments.callee的使用,这是一个很常见的技巧。不过,你可否知道,还有个不常见的解决方案?看下面的代码,呵呵:
var a=0;
var f={};
f.ff=function i_am_a_temp_named_function(){
//这里做一些事情,然后需要递归的时候,也可以不用callee喔
i_am_a_temp_named_function()
};
//但是,外面是看不到我的哦,呵呵
alert(typeof i_am_a_temp_named_function)
|
|
| 返回顶楼 | |
|
时间:2008-07-01
笨笨狗 写道
其实这里的关键不在于apply,而在于arguments.callee的使用,这是一个很常见的技巧。不过,你可否知道,还有个不常见的解决方案?看下面的代码,呵呵:
var a=0;
var f={};
f.ff=function i_am_a_temp_named_function(){
//这里做一些事情,然后需要递归的时候,也可以不用callee喔
i_am_a_temp_named_function()
};
//但是,外面是看不到我的哦,呵呵
alert(typeof i_am_a_temp_named_function)
var a=0;
var f={};
var ff=function i_am_a_temp_named_function(){
alert(this);
a++;
if (a>2) return ;
i_am_a_temp_named_function()
};
ff();
var a=0;
f.ff=ff;
f.ff()
|
|
| 返回顶楼 | |
|
时间:2008-07-01
笨笨狗 写道 其实这里的关键不在于apply,而在于arguments.callee的使用,这是一个很常见的技巧。不过,你可否知道,还有个不常见的解决方案?看下面的代码,呵呵:
var a=0;
var f={};
f.ff=function i_am_a_temp_named_function(){
//这里做一些事情,然后需要递归的时候,也可以不用callee喔
i_am_a_temp_named_function()
};
//但是,外面是看不到我的哦,呵呵
alert(typeof i_am_a_temp_named_function)
这个JScript不兼容 哈哈 微软这地方搞得乱七八糟 |
|
| 返回顶楼 | |
|
时间:2008-07-01
achun 写道 有道理,应该是善用arguments.callee.这就改改标题. 不过你的方法只是说明的技巧,可是这个技巧无法用到Mixin的继承性上呀! 要达到你说的目的,还得用上apply i_am_a_temp_named_function.apply(this, arguments) 这么看来,你之前的标题也没错,这两者都得有用上,哈哈哈 |
|
| 返回顶楼 | |
|
时间:2008-07-01
IE不支持么?这个倒没证实过,因为并不常用,一般都callee了。
如果真是如此,也无话可说,M$的德行就那样,直接无视罢了。 |
|
| 返回顶楼 | |
|
时间:2008-07-01
|
|
| 返回顶楼 | |
|
时间:2008-07-01
笨笨狗 写道 IE不支持么?这个倒没证实过,因为并不常用,一般都callee了。
如果真是如此,也无话可说,M$的德行就那样,直接无视罢了。 社区的力量是如此巨大...... 所谓众口铄金啊...... 怎么也想不出FF如何变成的社区里正义的化身 OK 大家继续打倒蓝色幽浮 拯救人类吧 - -! 潜水吃饭 |
|
| 返回顶楼 | |
|
时间:2008-07-05
刚刚产生了一个新的想法. |
|
| 返回顶楼 | |
|
时间:2008-07-05
你们在讨论什么,arguments.callee什么含义?就是调用当前参数对象的被调用函数,废话当然就是foo1或foo2函数本身,为什么你说开始会有不同,废话,apply(this和foo1()直接能一样吗,this的context就会随着执行变化而变化,而foo1(可能吗?
foo1就===arguments.callee 最后,你们说的什么ms不支持什么ff.i_temp什么东西,哪个是ie只支持FunctionDeclaration不支持FunctionExpression,结果更是废话,回去好好看看权威指南再来发帖子 |
|
| 返回顶楼 | |






