精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-01
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:');
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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,结果更是废话,回去好好看看权威指南再来发帖子 |
|
返回顶楼 | |