Javascript 下划线如何替换变量?
我有以下代码行:Javascript 下划线如何替换变量?,javascript,templates,underscore.js,frontend,Javascript,Templates,Underscore.js,Frontend,我有以下代码行: terminalsListHtml += this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj)); 这场争吵的行为令我惊讶 我计算这个.compiled方法的参数值。 看起来是这样的: 更多详情: compiled: _.template($('#terminal-template').text()) 让我们回到第一排,谁的结果令我惊讶: 它返回以下结果: this.compiled(_.exte
terminalsListHtml += this.compiled(_.extend(this.terminals[i], {clazz: 'all'}, obj));
这场争吵的行为令我惊讶
我计算这个.compiled方法的参数值。
看起来是这样的:
更多详情:
compiled: _.template($('#terminal-template').text())
让我们回到第一排,谁的结果令我惊讶:
它返回以下结果:
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>
"
this.compiled(u.extend(this.terminals[i],{clazz:'all'},obj));
"
第二
列宁纳,5岁
第二
10
"
正如我们所看到的,{{imageId}
被1
取代
我不明白这个1
需要花多少时间。
请澄清
P.P.S。
很抱歉,屏幕截图而不是复制的代码。我想粘贴代码,但效果不好。此行:
compiled: _.template($('#terminal-template').text())
将字符串(具有id=“terminal template”
的元素的文本内容)转换为可在以后进行计算的函数:
然后调用this.compiled(object)
将object
设置为上下文来呈现模板(调用先前编译的模板函数),因此如果对象具有键imageId
,则将替换模板字符串中的{imageId}
。它看起来像是从.extend(this.terminals[i],{clazz:'all'},obj)
返回的对象具有该键,它等于1
根据您提供的屏幕截图判断,它可能会生成
但是imageId
可能来自对象的原型,甚至来自全局范围(这已在注释中的讨论中得到确认:window.imageId==1
)
编辑:奇怪的是,下划线仅在使用.templateSettings
更改语法时才到达全局范围:-使用默认值
不会呈现全局变量,但{{variable}
会呈现全局变量。@gstackoverflow是否可以尝试.extend(this.terminals[i],{clazz:'all'},obj).imageId
和window.imageId
并检查其中是否有返回1
?window.imageId返回1@gstackoverflow正如我所怀疑的,它来自全球范围。它看起来像是范围问题,在我看来,它不应该超出传递给compiled()
(库中可能有一些检查)的对象的范围,但这是JS的设计方式。你能提供修复吗?@gstackoverflow不幸的是,我无法修补库,我可以理解为什么检查不在那里-它需要调用if(context.hasOwnProperty(key))
在每次替换{key}
时调用,这将是性能方面的一个缺点。现在,根据JS语言中解析变量的规则,它只解析为key
的值。您可以删除window.imageId
如果您知道您将不需要它。请阅读评论: