Javascript 为什么这个函数适用于文本,而不适用于更复杂的表达式?

Javascript 为什么这个函数适用于文本,而不适用于更复杂的表达式?,javascript,debugging,types,Javascript,Debugging,Types,我有一些潜在的JavaScript问题需要帮助。我正在从JSON结构生成HTML。我的想法是,我应该能够通过如下列表: ['b',{'class':'${class_name}'}, ['i', {}, 'Some text goes here']] …并获取(如果类名='foo') 当我使用alert()捕获renderLogicalElement()的第一个参数时,我看到一个零。这是为什么??我觉得这是一些JavaScript类型的东西,可能与对象文字有关,但我不知道 编辑:我已将此代码连

我有一些潜在的JavaScript问题需要帮助。我正在从JSON结构生成HTML。我的想法是,我应该能够通过如下列表:

['b',{'class':'${class_name}'}, ['i', {}, 'Some text goes here']]
…并获取(如果
类名='foo'

当我使用
alert()
捕获
renderLogicalElement()
的第一个参数时,我看到一个零。这是为什么??我觉得这是一些JavaScript类型的东西,可能与对象文字有关,但我不知道

编辑:我已将此代码连接到页面上按钮的单击事件。每次单击都会向ID为
kv\u body
元素添加新行。第一次调用此函数时,
同级
实际上为零。但是,一旦我们将
添加到混合中,
兄弟.length
计算为正确的计数,每次添加
时都会增加。抱歉没有说清楚!!:)


提前感谢您提供的任何建议。

如果
新的\u id
0
,这不意味着
兄弟姐妹。长度
是0吗?也许真的没有兄弟姐妹。

也许兄弟姐妹。长度实际上是0?尝试进一步调试(例如使用Firebug)

好的,我已经修复了它。事实证明,我在第一次函数调用中修改了源JSON对象(因为在JS中,基本上只是传递指针)。我需要编写一个复制函数,该函数将生成相关数据的新副本

最后,我将其作为原型函数删除,并制作了一个常规的旧函数

<b class='foo'><i>Some text goes here.</i></b>
function replaceVariableSequences(str, vars) {
    /* @TODO Compiling two regexes is probably suboptimal. */
    var patIdent = /(\$\{\w+\})/;  // For identification.
    var patExtr = /\$\{(\w+)\}/;  // For extraction.

    var pieces = str.split(patIdent);

    for(var i = 0; i < pieces.length; i++) {
        if (matches = pieces[i].match(patExtr)) {
            pieces[i] = vars[matches[1]];
        }
     }

     return pieces.join('');
 }

function renderLogicalElement(vars, doc) {
    if (typeof(doc[0]) == 'string') {

        /* Arg represents an element. */

        /* First, perform variable substitution on the attribute values. */
        if (doc[1] != {}) {
            for(var i in doc[1]) {
                doc[1][i] = replaceVariableSequences(doc[1][i], vars);
            }
        }

        /* Create element and store in a placeholder variable so you can
           append text or nodes later. */

        var elementToReturn = createDOM(doc[0], doc[1]);

    } else if (isArrayLike(doc[0])) {

        /* Arg is a list of elements. */
        return map(partial(renderLogicalElement, vars), doc);

    }

    if (typeof(doc[2]) == 'string') {

        /* Arg is literal text used as innerHTML. */
        elementToReturn.innerHTML = doc[2];

    } else if (isArrayLike(doc[2])) {

        /* Arg either (a) represents an element
                   or (b) represents a list of elements. */
        appendChildNodes(elementToReturn, renderLogicalElement(vars, doc[2]));

    }

    return elementToReturn;
}
/* Correct; Works as expected. */
var siblings = findChildElements($('kv_body'), ['tr']);
var new_id = 4;

appendChildNodes($('kv_body'),
                 renderLogicalElement({'id': new_id},
                                      templates['kveKeyValue']));




/* Incorrect; Substitutes "0" for the expression instead of the value of
   `siblings.length` . */
var siblings = findChildElements($('kv_body'), ['tr']);
var new_id = siblings.length;  // Notice change here!

appendChildNodes($('kv_body'),
                 renderLogicalElement({'id': new_id},
                                      templates['kveKeyValue']));