JavaScript中的深层嵌套函数

时间:2012-08-26 17:53:35

标签: javascript

我找不到一个适当的例子来说明我对生活的热爱如何做到这一点,或者即使这是可能的。根据我对exmaples片段的拼凑理解,我提出了以下结构

         var t = function()
         {
             this.nestedOne = function()
             {
                 this.nest = function()
                 {
                     alert("here");
                 }
             }
         } 
         t.nestedOne.nest();

然而,这显然不起作用(显然)。如果有人能指出我正确的方向,我将不胜感激!

4 个答案:

答案 0 :(得分:3)

只需完成:

var t = {
    nestedOne: {
        nest: function() {
            alert('here');
        }
    }
};

否则您的代码没有意义。函数内部this不引用函数本身,它引用调用函数的对象上下文。你甚至没有调用代码中的函数。

如果我说obj.func(),则this内的func将为该obj this.asd = true。因此,分配true会将"asd"分配给该对象的ClassA = (function() { function ClassA() { } ClassA.prototype.method1 = function() { }; function ClassB() { } ClassB.prototype.method1 = function() { }; return ClassA; }()) 属性。

如果你想做一个嵌套类,它看起来非常不同:

{{1}}

现在只有ClassA可以创建ClassB的实例。这应该与java中的嵌套类实现相同的目标。

答案 1 :(得分:2)

请参阅http://jsfiddle.net/CstUH/

function t(){
     function f(){
         this.nest = function()
         {
             alert("here");
         }
     }
     this.nestedOne = new f();
 }
var myt=new t();
myt.nestedOne.nest()

修改1:

您也可以使用

new t().nestedOne.nest()

而不是

var myt=new t();
myt.nestedOne.nest()

http://jsfiddle.net/CstUH/1/

编辑2:

甚至更加浓缩:

function t(){
    this.nestedOne = new function(){
        this.nest = function(){
            alert("here");
        }
    }
}
new t().nestedOne.nest()

http://jsfiddle.net/CstUH/2/

答案 2 :(得分:1)

在JS函数中是素数类对象,你可以直接在代码中访问它们[即不使用反射左右]。

您在t正文中执行的代码将在实际执行t时执行:

t();

你写了t.nestedOne,nest(),但t没有nestedOne属性 - 你应该这样做:

var t = {

    nestedOne : {

        nest : function()
        {

            alert("here");

        }        

    }

};

t.nestedOne.nest();                ​

我建议你去John Resig's Learning Advanced JavaScript教程旅行,这对我很有启发。

答案 3 :(得分:0)

我今天写的一个简单的回调处理程序,作为我如何进行深度嵌套的示例。如果在代码风格方面不是蜜蜂的膝盖,我很抱歉,这让我的概念更加清晰。

    function test () {
      this.that = this;
      this.root = this;

      this.jCallback = new Array(new Array()); // 2d
      this.jCallbackCount = -1;
      this.str = "hello";


      // Callback handler... 
      this.command = {
        that : this, // let's keep a reference to who's above us on the food chain
        root : this.root, // takes us back to the main object

        // add : function() { var that = this; console.log(that.that.str); },
        add : function(targetFnc, newFunc) { 
            var that = this; 
            var home = that.that; // pretty much root but left in as an example of chain traversal.
            var root = this.root; // useful for climbing back up the function chain

            // console.log(that.that.str); 
            home.jCallbackCount++;
            // target, addon, active
            home.jCallback[home.jCallback.length] =  { 'targetFunc' : targetFnc,  'newFunc' : newFunc,  'active' : true, 'id': home.jCallbackCount};

            console.log('cbacklength: ' + home.jCallback.length);
            console.log('added callback targetFunction:[' + targetFnc + ']');

            return home.jCallbackCount; // if we want to delete this later...      
        },

        run : function(targetFnc) {
            var that = this; 
            var home = that.that;
            console.log('running callback check for: ' + targetFnc + '  There is : ' + (home.jCallbackCount + 1) + 'in queue.');
            console.log('length of callbacks is ' + home.jCallback.length);

            for(i=0;i < home.jCallback.length - 1;i++)
            {
              console.log('checking array for a matching callback [' + targetFnc + ']...');
              console.log('current item: ' + home.jCallback[i]['targetFunc'] );
              if( home.jCallback[i]['targetFunc'] == targetFnc )
              {
                 // matched! 
                home.jCallback[i]['newFunc']();
              }

                // console.log(that.that.jCallback[i].targetFunction);
            }
        }
      };

    }

    test.prototype = {
      say : function () {
        var that = this;
        console.log('inside');
        // that.command('doSay');
        that.command.run('doSay');
        console.log(that.str);
      }


    } // end proto



    // BEGIN TESTING **************************************************************************
    // BEGIN TESTING **************************************************************************
    // BEGIN TESTING **************************************************************************
    var testing = new test();


    testing.command.add('doSay', function () { console.log('213123123'); } );
    testing.command.add('doSay', function () { console.log('12sad31'); } );
    testing.command.add('doSay', function () { console.log('asdascccc'); } );


    testing.say();

住: http://jsfiddle.net/Ps5Uf/

  • 注意:要查看控制台输出,只需在chrome中打开检查器,然后单击“控制台”选项卡。