下划线如何替换变量?

How does underscore replace variables?

我在代码中有以下行:

 terminalsListHtml += this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));

执行这一行的行为令我感到惊讶。

我计算 this.compiled 方法的参数值。
它看起来像这样:

更多详情:

compiled: _.template($('#terminal-template').text())

让 return 到第一行谁的结果让我感到惊讶:

return结果如下:

this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));
"
    <li data-terminal-id="201" class="">
        <label>
             
          <input type="checkbox" name="terminal" class="all" data-terminal-id="201" />
            <a href="#" title="" class="image"><img
                    src="getMediumThumbnail/1"
                    alt=""/></a>   
            <h3>Second
                <small>Lenina, 5</small>
            </h3>
            <p>Second</p>

            <p class="count">Проходимость: <span>10</span> чел./час</p>

            <p class="count">Стоимость: <span>5</span> руб./час</p>

            <p class="count">Количество свободных слотов: <span>10</span> </p>
        </label>
    </li>
"

我们可以看到 {{imageId}} 被替换为 1

我不明白这个 1 在哪里。
请澄清。

P.P.S.

抱歉是截图而不是复制的代码。我想粘贴代码,但效果不佳。

这一行:

 compiled: _.template($('#terminal-template').text())

将一个字符串(带有id="terminal-template"的元素的文本内容)转换为一个可以稍后计算的函数:http://underscorejs.org/#template

然后调用 this.compiled( object ) 渲染模板(调用之前编译的模板函数),并将 object 设置为上下文,因此如果对象有一个键 imageId 它将是替换模板字符串中的 {{imageId}}。看起来从 _.extend(this.terminals[i], {clazz: 'all'}, obj) 返回的对象有那个键,它等于 1.

根据您提供的屏幕截图判断,它可能会生成 <img src="getMediumThumbnail/undefined" ... />
但是 imageId 可能来自对象的原型,甚至可能来自全局范围(已在评论中的讨论中确认:window.imageId == 1)。

编辑:奇怪的是下划线仅在使用 _.templateSettings 更改语法时到达全局范围:http://jsfiddle.net/hoy9ga0d/ - 使用默认值 <%= variable %> 不会呈现全局变量,但 {{ variable }} 会。