0

数か月間、次のコーヒースクリプトを本番環境で使用しました。

yearSource = (yearsBack) ->
    endYear = new Date().getFullYear()+1
    label: year, value: year for year in [endYear - yearsBack .. endYear]  

このスクリプトにコンパイルされたもの:

yearSource = function(yearsBack) {
    var endYear, year, _i, _ref, _results;
    endYear = new Date().getFullYear() + 1;
    _results = [];
    for (year = _i = _ref = endYear - yearsBack; _ref <= endYear ? _i <= endYear : _i >= endYear; year = _ref <= endYear ? ++_i : --_i) {
      _results.push({
        label: year,
        value: year
      });
    }
    return _results;
  };

これは、指定された年以降の年のリストを返します。

スクリプトが再コンパイルされた更新を展開した後、突然スクリプトは次のようになります。

yearSource = function(yearsBack) {
    var endYear, year;

    endYear = new Date().getFullYear() + 1;
    return {
      label: year,
      value: (function() {
        var _i, _ref, _results;

        _results = [];
        for (year = _i = _ref = endYear - yearsBack; _ref <= endYear ? _i <= endYear : _i >= endYear; year = _ref <= endYear ? ++_i : --_i) {
          _results.push(year);
        }
        return _results;
      })()
    };
  };

リストは jQuery UI オートコンプリート ウィジェットのソースであると想定されているため、これにより事態が完全に破壊されました。

ループ作業を新しいインデント行に移動することで修正できます。

yearSource = (yearsBack) ->
    endYear = new Date().getFullYear()+1
    for year in [endYear - yearsBack .. endYear]
        label: year, value: year

コーヒースクリプトのバージョン間で問題が発生した原因は何ですか?

4

1 に答える 1

2

以前使用していた CoffeeScript のバージョンと、現在使用しているバージョンを知っていますか? これにより、CoffeeScript で何が変更されてこの問題が発生したかを正確に突き止めることができます。

しかし、正確な変更を知らなくても、何が変わったのかを感じるのはかなり簡単です。コードは次のように解析されていました。

(label: year, value: year) for year in [endYear - yearsBack .. endYear]

しかし、今では次のように解析されています。

label: year, value: (year for year in [endYear - yearsBack .. endYear])

すなわち、内包の優先順位が変更され、今だけyearが内包の一部であると見なされるようになりました。

于 2013-09-16T20:21:49.233 に答える