论坛首页 Web前端技术论坛

善用arguments.callee.apply,让递归兼容Mixin,正确继承this

浏览 7008 次
精华帖 (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:');

 

   发表时间: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)


0 请登录后投票
   发表时间: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)



有道理,应该是善用arguments.callee.这就改改标题.
不过你的方法只是说明的技巧,可是这个技巧无法用到Mixin的继承性上呀!如果这样写的话也不对呀

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()
 
0 请登录后投票
   发表时间: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不兼容
哈哈 微软这地方搞得乱七八糟
0 请登录后投票
   发表时间:2008-07-01  
achun 写道

有道理,应该是善用arguments.callee.这就改改标题.
不过你的方法只是说明的技巧,可是这个技巧无法用到Mixin的继承性上呀!


要达到你说的目的,还得用上apply
i_am_a_temp_named_function.apply(this, arguments)

这么看来,你之前的标题也没错,这两者都得有用上,哈哈哈

0 请登录后投票
   发表时间:2008-07-01  
IE不支持么?这个倒没证实过,因为并不常用,一般都callee了。
如果真是如此,也无话可说,M$的德行就那样,直接无视罢了。
0 请登录后投票
   发表时间:2008-07-01  
各位帮我看看这个帖子
http://www.iteye.com/topic/209575
帮忙起个标题吧,我找不到合适的词汇.
0 请登录后投票
   发表时间:2008-07-01  
笨笨狗 写道
IE不支持么?这个倒没证实过,因为并不常用,一般都callee了。
如果真是如此,也无话可说,M$的德行就那样,直接无视罢了。

社区的力量是如此巨大......
所谓众口铄金啊......
怎么也想不出FF如何变成的社区里正义的化身
OK 大家继续打倒蓝色幽浮 拯救人类吧 - -!
潜水吃饭
0 请登录后投票
   发表时间:2008-07-05  

刚刚产生了一个新的想法.
既然javascript有如此这般的特性.
那能否把一些常用的算法都重新写成
完全兼容Mixin的形式
通过组合这些基本的函数,就可以形成不同的应用需求.
目前只是一个想法.
那到底哪些方面的函数可以这样写呢?

0 请登录后投票
   发表时间:2008-07-05  
你们在讨论什么,arguments.callee什么含义?就是调用当前参数对象的被调用函数,废话当然就是foo1或foo2函数本身,为什么你说开始会有不同,废话,apply(this和foo1()直接能一样吗,this的context就会随着执行变化而变化,而foo1(可能吗?

foo1就===arguments.callee

最后,你们说的什么ms不支持什么ff.i_temp什么东西,哪个是ie只支持FunctionDeclaration不支持FunctionExpression,结果更是废话,回去好好看看权威指南再来发帖子
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics