使用'use strict'和underscore.js的问题

ada*_*rie 8 javascript underscore.js yeoman underscore.js-templating

我使用Yeoman和backbone.js编写了一个应用程序.在我指定的每个js文件的顶部,'use strict';当我运行我的grunt任务时,jshint不会遇到任何错误.

我可以使用grunt构建我的应用程序而没有问题但是当我尝试运行uglified js时,我收到以下错误:

Uncaught SyntaxError: Strict mode code may not include a with statement

我搜索了代码库,使用with语句的唯一内容是下划线.

我是严格模式的新手,所以我不确定如何解决这个问题.我可以在任何使用underscorejs函数的地方使用严格模式吗?

谢谢.

编辑:

给出下面的代码示例(为简洁起见缩短).我怎么能改变它来解决这个问题.

'use strict';

/*global, Backbone, JST*/

var MyView = Backbone.View.extend({

    template: JST['app/scripts/templates/MyView.ejs'],

    initialize: function()
    {
        this.render();
    },

    render : function()
    {
        this.$el.html(this.template(this.templateVariables()));
        return this;
    },

    templateVariables: function()
    {
        return {var1 : 'Hello', var2 : 'World'};
    }
});
Run Code Online (Sandbox Code Playgroud)

在MyView.ejs中

<p><%= var1 %><%= var2 %>!</p> //<p>Hello World!</p>
Run Code Online (Sandbox Code Playgroud)

编辑2:

在下面使用@mu太简短的答案我发现解决给我悲伤的_.template调用的最好方法是改变我的grunt-JST任务,如下所示:

jst: {
        compile: {
            options:
            {
                templateSettings:
                {
                    variable: 'data'
                }
            },
            files: {
                '.tmp/scripts/templates.js': ['<%= yeoman.app %>/scripts/templates/*.ejs']
            }
        }
    },
Run Code Online (Sandbox Code Playgroud)

然后更改我的每个模板以使用该<%= data.templateVariable %>格式.

可能不适用于其他人,但我使用Yeoman和Grunt以及Backbone生成器遇到了这个问题,所以我不能成为唯一一个.

mu *_*ort 18

下划线的_.template使用with在内部,让喜欢的事情<%= pancakes %>要解决,obj.pancakes.如果你看看里面_.template,你会发现:

if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
Run Code Online (Sandbox Code Playgroud)

这就是进攻的with来源.如果您正在使用JST样式的预编译模板,source那么您最终将在JST对象内部进行操作,这使得withs在范围内可见"use strict".请注意settings.variable那里?文件说:

默认情况下,模板通过with语句将数据中的值放在本地作用域中.但是,您可以使用变量设置指定单个变量名称.这可以显着提高模板能够呈现的速度.

_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"
Run Code Online (Sandbox Code Playgroud)

因此,您可以在编译模板时with使用该variable选项来抑制s ; 当然,这也意味着你必须重写<%= ... %>模板的所有部分以匹配variable选项所说的内容(这也应该加快你的模板,所以它可能是值得的).

在您的情况下,您将模板更改为:

<p><%= data.var1 %><%= data.var2 %>!</p> //<p>Hello World!</p>
Run Code Online (Sandbox Code Playgroud)

然后你需要更改_.template用于编译模板的调用,如下所示:

var compiled_template = _.template(raw_template, null, { variable: 'data' });
Run Code Online (Sandbox Code Playgroud)

data当然不必使用,您只需要在模板和_.template调用中使用相同的东西.

我不知道你如何改变设置电话的方式_.template但不应该那么困难.我想你可以将补丁作为最后的手段_.template来获得默认值variable.

这是一个简单的演示,应该说明发生了什么:http://jsfiddle.net/ambiguous/Az8QM/


或者,如果我们看看"use strict"范围如何,我们将看到:

严格模式适用于整个脚本单个功能.

因此,您可以通过以下方式本地化您的严格性:

(function() {
    "use strict";
    // All your non-JST JavaScript goes here.
})();
// Append your JST out here.
Run Code Online (Sandbox Code Playgroud)

您还可以使用两个JavaScript文件而不只是一个:

  1. 一个用于"use strict"启用非模板JavaScript的.
  2. 只有你的第二个JST,这个不会 "use strict".