Javascript 为什么这个循环看起来错综复杂?

Javascript 为什么这个循环看起来错综复杂?,javascript,Javascript,下面的循环使用object literalobj_fav构建一个HTML字符串,该字符串包含收藏夹列表 由于HTML字符串可以附加到多个位置,ns\u标记名称空间会对DOM ID进行命名,以确保它们是唯一的 这有点离题。我觉得这个循环逻辑性很差。这本书写得很好,但我觉得读起来很难,感觉写得很差。但我不知道这是为什么 // $A.someIndex() implements array.prototype.some // create favorite pane strings $A.someI

下面的循环使用object literal
obj_fav
构建一个HTML字符串,该字符串包含收藏夹列表

由于HTML字符串可以附加到多个位置,
ns\u标记
名称空间会对DOM ID进行命名,以确保它们是唯一的

这有点离题。我觉得这个循环逻辑性很差。这本书写得很好,但我觉得读起来很难,感觉写得很差。但我不知道这是为什么

// $A.someIndex() implements array.prototype.some

// create favorite pane strings
$A.someIndex(obj_fav, function (val) {
    previous_id = current_id;
    current_id = this.A.ns_tag + selector + val.tag;

    // new tag found, close previous and open new
    if ((previous_id === undefined) || (previous_id !== current_id)) {

        // populate tag array
        this.A['tag_array' + selector].push(current_id);
        tag_string = tag_string + this.composeTag(current_id, selector);
        if (previous_id !== undefined) {
            favorite_string += '</div>';
        }
        favorite_string = favorite_string +
            '<div class="bookmark_page toggle_display_none" id = "' + current_id + '_page">';
    }

    // add set of favorites between page tags

    favorite_string += this.composeFavorite(val, selector);
}, this);
/$A.someIndex()实现array.prototype.some
//创建收藏夹窗格字符串
$A.someIndex(对象、功能(val){
上一个\u id=当前\u id;
当前_id=this.A.ns_标记+选择器+val.tag;
//找到新标签,关闭上一个并打开新标签
if((上一个_id==未定义)| |(上一个_id!==当前_id)){
//填充标记数组
这个.A['tag\u array'+选择器].push(当前的\u id);
tag_string=tag_string+this.composeTag(当前_id,选择器);
如果(上一个_id!==未定义){
收藏夹_字符串+='';
}
收藏夹字符串=收藏夹字符串+
'';
}
//在页面标记之间添加一组收藏夹
favorite_string+=this.composeFavorite(val,选择器);
},这个);
此代码段包含在此klass中:

/*******************************************************************************
**SArcmarks
*/


    var SArcmarks = $A.klass({

        Name: 'SArcmarks',

        // namespacing helps to prevent name clashes        // base_location_id_subdivisions        // there are 2 prefixes and one suffix

        A: {
            // namespace suffix             base:                    'udt'          loc:                     null,
            ns_tag:                  'udt_',
            ns_tag1:                 'udt_1_',
            tag_array:               [],
            tag_array1:              [],
            prev_page_el:            null,
            prev_tag_el:             null,
            but_text:                null,

            // toggles
            toggle_display_none:     'toggle_display_none',
            toggle_display_inline:   'toggle_display_inline',
            toggle_tag_active:       'toggle_tag_active',
            toggle_tag_lazy:         'toggle_tag_lazy',

            // morphing
            class_a:                 null
        },

        E: {
            hold_arcmarks:           '#hold_arcmarks',
            hold_tags:               '#hold_tags',
            aba_but_del:             '#aba_but_del',
            bookmark_link:           '@bookmark_link'
        },

/******************************************************************************/

        update: function (obj_fav, fav_el, tag_el) {
            var favorite_string = '',
                tag_string = '',
                current_id,
                previous_id,
                selector;

            if (fav_el) {
                selector = 1;
            } else {
                selector = '';
            }

            // create favorite pane strings
            $A.someIndex(obj_fav, function (val) {
                previous_id = current_id;
                current_id = this.A.ns_tag + selector + val.tag;

                // new tag found, close previous and open new
                if ((previous_id === undefined) || (previous_id !== current_id)) {

                    // populate tag array
                    this.A['tag_array' + selector].push(current_id);
                    tag_string = tag_string + this.composeTag(current_id, selector);
                    if (previous_id !== undefined) {
                        favorite_string += '</div>';
                    }
                    favorite_string = favorite_string +
                        '<div class="bookmark_page toggle_display_none" id = "' + current_id + '_page">';
                }

                // add set of favorites between page tags

                favorite_string += this.composeFavorite(val, selector);
            }, this);

            // close last tag

            favorite_string = favorite_string + '</div>';

            // if atleast one favorite/tag

            if (this.A['tag_array' + selector][0]) {
                if (!fav_el) {
                    this.E.hold_arcmarks.innerHTML = favorite_string;
                } else {
                    fav_el.innerHTML = favorite_string;
                }
                if (!tag_el) {
                    this.E.hold_tags.innerHTML = tag_string;
                } else {
                    tag_el.innerHTML = tag_string;
                }
                this.initPane(selector);
                this.flip($A.el('#' + this.A['tag_array' + selector][0]));
            }
        },

/******************************************************************************/

        composeFavorite: function (val, selector) {

            // add selector
            if (val.favicon === null) {
                val.favicon = 'arcmarks/images/image_null_50.png';
            }
            return '<div class = "am_hold" id = "' + val.id + selector + '">' +
                     '<img name="bo_im" id="' + $A.addU(val.id + selector, 'a') +
                     '" class="bookmark_image" src="' + val.favicon + '">' +
                     '<a target="_blank" name="bookmark_link" class="bookmark_link" href = "' +
                      val.url + '" id="' + $A.addU(val.id + selector, 'b') + '">' + val.title + '</a>' +
                   '</div>';
        },

/******************************************************************************/

        composeTag: function (current_id, selector) {

            // selector
            return '<p class="single_tag toggle_tag_lazy" id = "' + current_id + '">' +
                    current_id.slice(this.A['ns_tag' + selector].length) + '</p>';
        },

/******************************************************************************/

        // add listeners to tag(<p>) elements
        initPane: function (selector) {
            $A.someIndex(this.A['tag_array' + selector], function (val) {
                var self = this;
                $A.el('#' + val).addEventListener("click", function () {
                    self.flip(this);
                });
            }, this);
        },

/******************************************************************************/

        // flip page(<div>) | tag(<p>) given a tag

        flip: function (tag_element) {
            var page_element = $A.el('#' + tag_element.id + '_page');
            $A.addClass(page_element, this.A.toggle_display_inline);
            $A.addClass(tag_element, this.A.toggle_tag_active);
            if (this.A.prev_page_el && (tag_element.id !== this.A.prev_tag_el.id)) {
                $A.addClass(this.A.prev_page_el, this.A.toggle_display_none);
                $A.addClass(this.A.prev_tag_el, this.A.toggle_tag_lazy);
            }
            this.A.prev_page_el = page_element;
            this.A.prev_tag_el = tag_element;
            $A.log(page_element);
        },

        // insert favorite(<div>) given user input

        insertFavorite: function (obj_fav) {
            var tag_id = this.A.ns_tag + obj_fav.tag,
                div_el,
                html_string = this.composeFavorite(obj_fav),
                page_el = $A.el('#' + tag_id + '_page');

            div_el = $A.HTMLToElement(html_string);

            if (!page_el) {
                page_el = this.insertTagAndPage(tag_id);
            }
            $A.eachChild(page_el, function (iter) {
                if (iter === null) {
                    page_el.appendChild(div_el);
                    return true;
                }
                if (div_el.id < iter.id) {
                    page_el.insertBefore(div_el, iter);
                    return true;
                }
                if (iter === page_el.lastChild) {
                    page_el.appendChild(div_el);
                    return true;
                }
            });

            this.flip($A.el('#' + tag_id));
            return div_el;

        },

/******************************************************************************/

        // insert page(<div>) | tag(<p>) given a tag id

        insertTagAndPage: function (tag) {
            var par_el,
                div_el,
                hold_tags_el,
                hold_arcmarks_el,
                self = this;

            hold_tags_el = this.E.hold_tags;
            hold_arcmarks_el = this.E.hold_arcmarks;

            par_el = $A.createElement('p');
            par_el.innerHTML = tag.slice(this.A.ns_tag.length);
            par_el.className = "single_tag";
            par_el.id = tag;

            // insert the tag(<p>)

            $A.eachChild(hold_tags_el, function (iter) {
                if (iter === null) {
                    hold_tags_el.appendChild(par_el);
                    return true;
                }
                if (par_el.id < iter.id) {
                    hold_tags_el.insertBefore(par_el, iter);
                    return true;
                }
                if (iter === hold_tags_el.lastChild) {
                    hold_tags_el.appendChild(par_el);
                    return true;
                }
            });

            par_el.addEventListener("click", function () {
                self.flip(this);
            });

            div_el = $A.createElement('div');
            div_el.className = "bookmark_page";
            div_el.id = tag + "_page";
            div_el.style.display = "";

            // insert the page(<div>);

            $A.eachChild(hold_arcmarks_el, function (iter) {
                if (iter === null) {
                    hold_arcmarks_el.appendChild(div_el);
                    return true;
                }
                if (div_el.id < iter.id) {
                    hold_arcmarks_el.insertBefore(div_el, iter);
                    return true;
                }
                if (iter === hold_arcmarks_el.lastChild) {
                    hold_arcmarks_el.appendChild(div_el);
                    return true;
                }
            });

            return div_el;
        },

/******************************************************************************/

        // delete a favorite(<div>) given a link

        deleteFavorite: function (link_el) {
            var self = this,
                div_el = link_el.parentNode;
            $(div_el).toggle("explode", function () {
                if (div_el.previousSibling === null &&
                        div_el.nextSibling === null) {
                    self.deleteTagAndPage(div_el);
                }
                $A.removeElement(div_el);
            });
        },

/******************************************************************************/

        // delete tag(<p>) and page(<div>) given a favorite sub-element

        deleteTagAndPage : function (div_el) {
            var page_el = div_el.parentNode,
                tag_el = $A.el('#' + page_el.id.slice(0, -5)),
                hold_el = $A.el("#hold_tags");
            $A.removeElement(tag_el);
            $A.removeElement(page_el);
            $A.eachChild(hold_el, function (iter_el) {
                if (iter_el) {
                    this.flip(iter_el);
                    return true;
                }
            }, this);
        },

/******************************************************************************/

        morph: function (callback) {
            var i = 0,
                button = this.E.aba_but_del;
            if (this.A.but_text === 'Done') {
                this.A.but_text = 'Delete';
                this.A.class_a = 'bookmark_link';
                while (this.E.bookmark_link[i]) {
                    this.E.bookmark_link[i].removeEventListener("click", callback);
                    this.E.bookmark_link[i].className = this.A.class_a;
                    i += 1;
                }
                button.innerHTML = this.A.but_text;
            } else {
                this.A.but_text = 'Done';
                this.A.class_a = 'bookmark_delete';
                while (this.E.bookmark_link[i]) {
                    this.E.bookmark_link[i].addEventListener("click", callback);
                    this.E.bookmark_link[i].className = this.A.class_a;
                    i += 1;
                }
                button.innerHTML = this.A.but_text;
            }
        }

    }, true);
/*******************************************************************************
**肉痕
*/
var SArcmarks=$A.klass({
名称:“SArcmarks”,
//名称空间有助于防止名称冲突//基本\u位置\u id\u细分//有两个前缀和一个后缀
A:{
//命名空间后缀base:'udt'loc:null,
ns_标签:“udt_uu”,
N_tag1:‘udt_1’,
标记数组:[],
标签阵列1:[],
上一页:空,
上一个标签:空,
但是文本:空,
//切换
切换显示无:“切换显示无”,
toggle_display_inline:“toggle_display_inline”,
toggle_tag_active:“toggle_tag_active”,
toggle_tag_lazy:“toggle_tag_lazy”,
//变形
类别a:空
},
E:{
保持弧痕:“#保持弧痕”,
挂起标签:“#挂起标签”,
aba_但是_del:'aba_但是_del',
书签链接:“@bookmark\u link”
},
/******************************************************************************/
更新:功能(obj_fav、fav_el、tag_el){
var favorite_string='',
标记字符串=“”,
当前用户id,
以前的身份证,
选择器;
如果(fav_el){
选择器=1;
}否则{
选择器=“”;
}
//创建收藏夹窗格字符串
$A.someIndex(对象、功能(val){
上一个\u id=当前\u id;
当前_id=this.A.ns_标记+选择器+val.tag;
//找到新标签,关闭上一个并打开新标签
if((上一个_id==未定义)| |(上一个_id!==当前_id)){
//填充标记数组
这个.A['tag\u array'+选择器].push(当前的\u id);
tag_string=tag_string+this.composeTag(当前_id,选择器);
如果(上一个_id!==未定义){
收藏夹_字符串+='';
}
收藏夹字符串=收藏夹字符串+
'';
}
//在页面标记之间添加一组收藏夹
favorite_string+=this.composeFavorite(val,选择器);
},这个);
//关闭最后一个标签
收藏夹字符串=收藏夹字符串+“”;
//如果至少有一个收藏夹/标签
if(this.A['tag_array'+选择器][0]){
如果(!fav_el){
这个.E.hold_arcmarks.innerHTML=收藏夹_字符串;
}否则{
fav_el.innerHTML=最喜爱的字符串;
}
如果(!tag_el){
this.E.hold_tags.innerHTML=tag_string;
}否则{
tag_el.innerHTML=tag_字符串;
}
此.initPane(选择器);
this.flip($A.el('#'+this.A['tag#u array'+selector][0]);
}
},
/******************************************************************************/
composeFavorite:函数(val、选择器){
//添加选择器
如果(val.favicon==null){
val.favicon='arcmarks/images/image_null_50.png';
}
返回“”+
'' +
'' +
'';
},
/******************************************************************************/
composeTag:函数(当前id,选择器){
//选择器
返回'

'+ 当前的_id.slice(this.A['ns_标记'+选择器].length)+'

'; }, /******************************************************************************/ //将侦听器添加到标记()元素 初始化窗格:函数(选择器){ $A.someIndex(这个.A['tag_array'+选择器],函数(val){ var self=这个; $A.el(“#”+val).addEventListener(“单击”,函数(){ 翻转(这个); }); },这个); }, /******************************************************************************/ //翻页()|标记()给定标记 翻转:功能(标记元素){