7

私はYeomanとbackbone.jsを使ってアプリを書いています。すべてのjsファイルの先頭には'use strict';が指定されています。私が不快な作業を実行すると、jshintはエラーに遭遇しません。私は、コードベースを検索したwith use with 'strict'とunderscore.js

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

と唯一のもの:私は、私は次のエラーを取得するuglified JSを実行しようとすると、

は、しかし私は、問題なくうなり声と私のアプリを構築することができていますwithステートメントを使用すると、アンダースコアになります。

私は厳密なモードに慣れていないので、この問題をどのように解決できるかわかりません。私がunderscorejs関数を使用する場所で厳密なモードを使用することはできませんか?

ありがとうございました。

EDIT:以下のコードサンプルを考える

(簡潔にするために短縮)。この問題を解決するには、どうすれば変更できますか? MyView.ejsで

'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'}; 
    } 
}); 

<p><%= var1 %><%= var2 %>!</p> //<p>Hello World!</p> 

EDIT 2:

私は最善の方法があること_.templateへの呼び出しを解決することを発見の下@muがあまりにもショートパンツの答えである使い方私に悲しみを与えていたのは、わざわざJSTの仕事を次のように変更したことです:

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

そして、それぞれのテンプレートを<%= data.templateVariable %>形式を使用するように変更します。

他人には当てはまらないかもしれませんが、私はGromanとBackboneジェネレータを備えたYeomanを使用してこの問題に遭遇しました。

+0

プリコンパイルされたアンダースコアテンプレートをどこかで使用していますか? Underscoreの 'with'は' _template'が生成するコードの中にあり、 '_'が生成するコンパイルされたテンプレート関数を見ていない限り誰も' 'が使われていることに気づくべきではありません。 –

+0

ちょうど私が理解しているので、あなたは_template()の下でどこでも使用していますか?はい、そうです。私はそのファイルの厳密なモードでより選択的にする必要があると仮定していますか? – adampetrie

+0

@muが短すぎます - 私はもう少し掘り下げました。私はアプリケーション全体でJSTテンプレートを使用しています。プリコンパイルされたtemplates.jsは、その中のステートメントとともに使用します。だから私の質問はどのように私はこれを解決することができますか? JSTテンプレートを持つビューファイルで 'use strict;'ディレクティブを削除し、 'grunt --force'を実行してjshintエラーを無視すると、縮小されたjで同じ結果が得られます。思考?ありがとう。 – adampetrie

答えて

17

アンダースコアの_.template<%= pancakes %>のようなものをobj.pancakesに解決するために内部でwithを使用します。あなたlook inside _.template場合、あなたはこれを見つける:

攻勢 withはどこから来るのです
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; 

。 JSTスタイルのプリコンパイルされたテンプレートを使用している場合、sourceJSTオブジェクト内で終了し、の範囲内でwithを可視にします。そこにsettings.variableがあることに注意してください。 The documentationは言う:

By default, template places the values from your data in the local scope via the with statement. However, you can specify a single variable name with the variable setting. This can significantly improve the speed at which a template is able to render.

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

ですから、テンプレートをコンパイルするときvariableオプションを使用してwithのを抑制することができます。テンプレートの<%= ... %>部分をすべて書き換えて、variableオプションの内容と一致するようにする必要があることも意味します(テンプレートのスピードを上げて、それだけの価値があるはずです)。

<p><%= data.var1 %><%= data.var2 %>!</p> //<p>Hello World!</p> 

をして、あなたはこのように見えるテンプレートをコンパイルするために使用され_.template呼び出しを変更する必要があるだろう:あなたのケースでは

、あなたはこれにテンプレートを変更したい

var compiled_template = _.template(raw_template, null, { variable: 'data' }); 

もちろん、dataを使用する必要はありません。同じテンプレートをテンプレートと_.templateコールで使用するだけです。

設定方法を変更する方法がわかりません_.templateしかし、それほど難しいとは限りません。サルパッチ_.templateは、最後の手段としてvariableのデフォルト値を持つことができます。ですから、あなたをローカライズすることができます

Strict mode applies to entire scripts or to individual functions.

:私たちはどのように"use strict" is scopedを見れば、私たちがいることがわかります、またhttp://jsfiddle.net/ambiguous/Az8QM/


:ここ

は何が起こっているのか説明する必要があります簡単なデモですこのような厳密さ:

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

あなたは

  1. "use strict"を使用しているテンプレート以外のJavaScriptの場合は、1つだけを使用してください。
  2. JSTと2番目のものは、ではなく、"use strict"となります。
+0

よく考えてみていただきありがとうございます。私は自分の問題に対する解決策がどこかにあると信じていますが、あなたが言ったことを作業コードに変換することはできません。私は私が働いているものの上のサンプルを提供しました。もしそうなら、それを実用的なソリューションに変換する方法を教えてください。理想的には、パフォーマンス改善のためにテンプレートを変換したいと考えています。再度、感謝します。 – adampetrie

+0

私は最初のアプローチのためにもう少し追加しました。私はこの種のもののためにRailsアセットパイプラインを使う傾向があるので、もっと具体的にすることはできません。 –

+0

もう一度ありがとうございます。 templateSettingsオプションを使用するようにgruntタスクを変更することによって、_.template呼び出しを解決することができました。何が必要なのかを示すために質問を編集しました。乾杯。 – adampetrie