之前有个代码是这样写的
function a(){
   function b(){
   }
   ...
   b()
   ...
}
在a函数内建了b函数,并在合乎条件的情况下调用b函数现在想把b拿出来,要求作用域仍然属于a,不允许其他对象访问,我尝试这样写:
function a(){
   ...
   b()
   ...
}
a.b=function(){
}但是执行a函数时出错,提示b没有定义,请问各位应该如何实现?

解决方案 »

  1.   

    function a(){
       arguments.callee.b()
    }
    a.b=function(){

    }
    或者 直接全局的就可以function a(){
       b()
    }
    b=function(){

    }
      

  2.   

    为什么一定要把b放到外面呢?那你试试下面这段代码吧Object.extend = function (destination, source, source1) {
        for (var property in source) {
            destination[property] = source[property];
        }
        if (typeof source1 != undefined) {
            for (var property1 in source1) {
                destination[property1] = source1[property1];
            }
        }
        return destination;
    }function a()
    {
    //方法
    }Object.extend(a,{
    b:function()
    {}
    });这样也能达到你的目的
      

  3.   

    function a(){
       function b(){
       }
       ...
       window.b = b;
       ...
    }b();
      

  4.   

    要求作用域仍然属于a
    用prototype关键字
      

  5.   

    .................
    这样就行了吧。。
    function a(){
    //do something
    }
    a.prototype.b = function() {
    //do something
    }
    var obj = new a();
    obj .b();
      

  6.   

    以上的回答都不能满足我的需要。必须实现以下三个基本要素:
    1、主函数a可以在其代码内随意调用子函数b()
    2、b也能够随意访问a内部定义的函数和对象
    3、而b离开了a不可见,至少不能成为全局函数。我只能想到主函数a内建函数b的写法,这种写法最简单——体现在相互调用简单,但这种方法的缺点是:b写死了,无法动态修改b,我参考了很多文章都不能很好实现我的需求。我想请教大家能够替代内建函数——又能够动态修改/替换b函数的最接近的方法,或者直接告诉我不可能实现之原因。
      

  7.   

    设置B为回调函数
    function b(){
        .......
        b里面写要实现的方法
    }
    函数a为调用函数
    function a(callback){
        ....调用b之前要执行的a的方法
        callback;    
    }
    执行函数(a函数,b函数封装好即可,只对外公开接口来供调用)
    function test(){
        a(b);//这里只是知道有个函数名是a还有个回调函数名是b,无需管里面的功能(具体功能有a,b函数处理)
    }
      

  8.   


    function a(){
    with(a)
    b();
    }
    a.b = function(){
    alert('bb');
    }
    a();
    a.b();这样可以不?
      

  9.   

    function a(){
       ...
       a.b()
       ...
    }
    a.b=function(){
    }
      

  10.   


            //构造函数a
    function a() {
    //声明私有变量_name, _age;
    var _name = 'csdn',
    _age = '13'; this.parm = '成员变量'; //b函数
    this.b = function() {
    alert('访问成员变量parm: ' + this.parm);
    alert('访问私有变量name: ' + _name);
    } //修改b函数方法,将私有变量以参数形式传入函数中
    this.setB = function(fn) {
    this.b = function() {
    fn.call(this, _name, _age);
    }
    } //内部执行b函数
    this.b();
    } var ins = new a(); //外部执行b函数
    ins.b(); //动态修改b函数
    ins.b = function() {
    //访问成员变量
    alert('动态修改b函数后,访问成员变量parm: ' + this.parm); /*这里就不能访问到a构造函数中的私有变量_name了,
    因为静态作用域是在函数声明时创建的,这里的静态作用域是全局的*/
    //alert('动态修改b函数后,访问成员变量name: ' + _name);
    } //执行修改后的b函数
    ins.b(); //调用setB方法修改b函数,私有变量以参数形式访问
    ins.setB(function(name, age) {
    alert('动态修改b函数后,访问成员变量parm: ' + this.parm);
    alert('动态修改b函数后,访问成员变量age: ' + age);
    }) //执行修改后的b函数
    ins.b();LZ看看符合你要求么