使用场景:
a.js调用onFunction函数:
onFunction(mycb);其中,mycb是a.js实现的一个回调函数,比如:
function mycb()
{
   alert("mycb");
}onFunction函数实现在b.js里面。
function onFunction(cb)
{
    var pp =  "<div id='test' cb='" + cb +"'>";
    pp += "</div>";
}当b.js执行某个操作后,调用此回调函数。function onBtnClicked()
{
     var cbFun = $("#test").attr('cb');
     cb(2);
}运行结果并未执行到mycb函数里面。
仔细看过,是因为传递到onFunction函数是,cb的值为整个函数实现的字符串。有人知道,应该如何实现这样的功能么?

解决方案 »

  1.   

    js没有函数指针的概念,, 直接把函数名传过去就可以调用了,
    onFunction在哪里调的,看着好晕
      

  2.   

    function onBtnClicked()
    {
         var cbFun = $("#test").attr('cb');
         eval(cbFun);
         cb(2);
    }
    这样就ok了
    这是一种什么样的垃圾写法,我就不说了给你换一下:
    window.cb=mycb;
    把这句放a.js里面
    b.js里面
    function onBtnClicked()
    {
         window.cb();
    }
      

  3.   

    ok。说明一下这样使用的原因吧。
    b.js其实是一个公用的js。里面的onFunction函数就是一个公用的函数。
    a.js只是其中一个调用者,可能还有c.js,d.js会调用onFunction函数,参数分别是各自实现的函数指针。
    之所以将cb函数指针放到div里面就是保存调用者的这个函数指针。因为有很多调用者,根本无法知道预先有多少个,也无法使用全局变量。我刚试过了,wzs_xyz的eval方法不行。或者没写对?问此问题前,我已经在网上搜过很多了,eval其实我试过,不行的。不知道你们试过没有。
    window.cb就更不行了,因为相当于使用了全局变量。第二个调用者,会冲调第一个的。
      

  4.   

    onFunction(mycb); 把 mycb 当参数传进去, 要调用, mycb(), 你不调用函数怎么会执行 - -
      

  5.   

    仔细点看
    onFunction只是保存调用者函数地址,要在某个相应事件的执行函数里面才能调用的。
    现在的问题,就是保存时不对,或者获取函数地址不对。导致回调不出去。如果直接在onFunction里面回调,是可以的。但程序执行流程不能这么做。
      

  6.   

    attr('cb'); 是字符串typeof()=="Function" 才是函数
    function mycb(fun)
    {
       fun();
    }mycb(function(){alert("匿名函数");});
      

  7.   

    先不说你的实现思路var cbFun = $("#test").attr('cb');
    cb(2);//这个cb是啥米东东?我愣是没看明白
      

  8.   

    从没听说过函数被多次调用就会冲突的说法,也没有不同的调用者调用函数就冲掉的说法,希望你只是表述不当而不是以为函数只能调用一次或者只能由一个调用者调用
    你这种写法确实很差劲这个不用怀疑
    把函数这样就到字符串里只能是得到该对象toString方法的返回值,所以是代码字符串,不是指针.js函数是引用类型,函数名自身就是指针,你这么自信的非要认为你的方法才可以,大家有什么办法function onBtnClicked()
    {
         var cbFun = $("#test").attr('cb');
         eval("var cb="+cbFun);
         cb(2);
    }
    这样写,除非你的函数本来就是错的,否则是肯定能执行的
      

  9.   

    eval真不行吗?如下:
    var cbFun = $("#test").attr('cb') + '();';
    eval(cbFun);
      

  10.   

    可能这位大侠没有明白我的意思,抑或我没有明白window.callback的意思。
    一点需要主要的是:我的程序实现不允许使用全局变量。如果a.js调用了window.callback,将这个回调函数的地址保存下来了。在回调之前,b.js又调用了window.callback,此时a.js还能回调进去么?难道window.callback不是一个全局函数?支持多实例?
      

  11.   


    不要怀疑我的回调函数有问题。不考虑多实例的情况下,使用全局变量是肯定可以调进去的。就是要保证多实例能使用,才不能使用全局变量。所以,需要为每个调用者,创建一个div object(这个本来就回创建),然后将回调函数的地址保存下来,这样,需要回调的时候,再取出函数地址,进行回调。我觉得这样的实现,应该没问题。或者有更好的实现方式么?
      

  12.   


    毛线的个不用全局变量,你都用了html来保存参数了,还说没用全局变量,html不是全局的???
    回调函数的话,我现在的工作就是开发js技术支持和js组件开发,你说我明不明白? 至于你说的window.callback,从没听说过有这个函数
    我也不想和你讨论你那方法了,爱杂用咋用吧,不关我事
      

  13.   

    刚刚激动了一下,现在回到问题中来
    开发可供多个地方调用的组件,是必须有一个全局的变量供调用的,
    当然,不管多少函数,可以只占据一个全局变量名,
    该全局变量名是一个对象,你要写的所有函数都可以作为该对象的成员,这也就是所谓的命名空间,
    应用中还可以在该命名空间上继续扩展下级的命名空间,
    当然全局对象上的成员实质也都是全局变量,但放一个对象上就可以避免命名冲突而且也显得规范
    jquery在全局占用的变量名是$和jQuery,extjs占用的是Ext,
    其他不同的库也都占用至少一个全局变量名(命名空间)
    你说的函数在其他多个地方要调用,所以不能写成全局的,实在是让人觉得荒谬
    你就写一个window.test=function(){alert(0);}(只在一个地方定义就可以了,重复定义变量才会导致前面的被覆盖,自己想想是不是多个文件都定义了你的函数导致前面的被覆盖),
    然后在多个js文件中调用,自己看它是不是就被冲掉了!
    你可能因为基础不够,写的代码不严密,导致了你描述的现象,
    这个需要自己调试,程序编写要能灵活变通,但也要严密,要注重基础,
    出问题的时候一定先网上搜一搜,
    不要就先想当然认定了一个原因,就去想办法变通!特别是没有掌握的东西
    变通实现只在确认常规方法不能实现的时候才用