jQuery插件中的自调用函数

时间:2015-04-10 12:29:29

标签: javascript jquery nested self-reference

我正在使用下面的自我调用函数生成一个使用javascript的树(嵌套的UL列表)。我可以补充一点,它是在一个jQuery插件中,如果这与问题完全相关(也许可能是?)。

变量gd包含从文件结构中嗅探的json /数组,因此它基本上是文件夹和图像的名称,还有一些更多的数据(比如自我解释的isFolder属性等)

        for (i = 0; i < gd.length; ++i) {

被自我呼叫打断。

    var drawTree = function(self,parent){

        var gd = self.data('galleryData');

        self.data('sidebar', self.data('sidebar')+'<ul>');

        for (i = 0; i < gd.length; ++i) {

            console.log('looping '+i+': '+gd[i]['name']+', isFolder: '+gd[i]['isFolder']+', parent: '+gd[i]['parent']);

            if ( (gd[i]['isFolder'] == true) && (gd[i]['parent'] == parent) ) {
                console.error(gd[i]['name']);
                self.data('sidebar', self.data('sidebar')+'<li data-folder="'+gd[i]['fileId']+'" class="folderLink">');
                self.data('sidebar', self.data('sidebar')+gd[i]['name']);

                self.data('drawTree')(self,gd[i]['fileId']); // <-- The line causing trouble

                self.data('sidebar', self.data('sidebar')+'</li>');
            }
        }

        self.data('sidebar', self.data('sidebar')+'</ul>');

    };
    this.data('drawTree',drawTree);

我的问题是,如果我忽略了问题&#34;行

self.data('drawTree')(self,gd[i]['fileId']);

哪一个进行自我调用(这使我能够列出子文件夹)然后我得到一个整洁的列表,所有&#34; 0级&#34;文件夹(没有父项或父项属性设置为空字符串的文件夹)。但是我当然不会得到任何嵌套文件夹。

Root
    actions
    appz
    categoriez
    david
    devices
    mimetypes
    places
    space
    status

如果我确实包含了自我调用,我会获得所有嵌套级别,但仅限于&#34;级别0和#34;的第一个文件夹,就好像主循环一样(这行来自上面的代码)

Root
    actions
        actionsSub1
            actionSub2
                actionSub3
                    actionSub4

1 个答案:

答案 0 :(得分:1)

你有一个全局变量。不要将var视为可选。

for (i = 0; i < gd.length; ++i) {  <-- i is global

现在,当您将var放在i前面时,其他函数调用不会更改它。

for (var i = 0; i < gd.length; ++i) {