下划线的_.template
uses with https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with在内部允许类似的事情<%= pancakes %>
待解决obj.pancakes
。如果你看看里面_.template https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L1199,你会发现这个:
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
这就是进攻的地方with
来自。如果您使用 JST 风格的预编译模板,那么source
就是你最终会得到的JST
对象,这使得with
s 范围内可见"use strict"
。请注意settings.variable
在那里?文档 http://underscorejs.org/#template says:
默认情况下,template通过以下方式将数据中的值放置在本地范围内with
陈述。但是,您可以使用以下命令指定单个变量名称variable环境。这可以显着提高模板的渲染速度。
_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"
所以你可以抑制with
通过使用variable
编译模板时的选项;当然,这也意味着你必须重写所有的<%= ... %>
模板的一部分以匹配variable
选项必须说(这也应该加速你的模板,所以它可能是值得的)。
对于您的情况,您可以将模板更改为:
<p><%= data.var1 %><%= data.var2 %>!</p> //<p>Hello World!</p>
然后你需要改变_.template
用于编译模板的调用如下所示:
var compiled_template = _.template(raw_template, null, { variable: 'data' });
你不必使用data
当然,您只需要在模板和应用程序中使用相同的东西即可_.template
call.
我不知道你会如何改变你的设置通话方式_.template
但这不应该那么困难。我想你可以猴子补丁_.template
有一个默认值variable
作为最后的手段。
这是一个简单的演示,可以说明正在发生的事情:http://jsfiddle.net/ambigously/Az8QM/ http://jsfiddle.net/ambiguous/Az8QM/
或者,如果我们看看如何"use strict"已确定范围 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode#Invoking_strict_mode,我们会看到:
严格模式适用于整个脚本 or to 个别功能.
所以你可以用这样的东西来定位你的严格性:
(function() {
"use strict";
// All your non-JST JavaScript goes here.
})();
// Append your JST out here.
您还可以使用两个 JavaScript 文件,而不是仅使用一个:
- 一款适用于您的非模板 JavaScript
"use strict"
已启用。
- 第二个只有你的
JST
, 这个会not "use strict"
.