【问题标题】:coffeescript local compiler and coffeescript to js site output different resultscoffeescript 本地编译器和 coffeescript 到 js 站点输出不同的结果
【发布时间】:2026-02-06 13:20:10
【问题描述】:

如果我在本地机器上使用咖啡脚本编译器将此咖啡脚本编译为 javascript:

window.App =
  Models: {}
  Views: {}
  Collections: {}
  Routers: {}
  init: ->
      Backbone.history.start()

我最终会得到这个生成的 javascript 输出:

// Generated by CoffeeScript 1.3.3
(function() {

  window.App = {
    Models: {},
    Views: {},
    Collections: {},
    Routers: {}
  };

  ({
    init: function() {
      var spotsList;
      spotsList = new App.Views.SpotsList();
      return Backbone.history.start();
    }
  });

}).call(this);

但是,如果我将在线咖啡脚本中的相同代码编译到 js http://js2coffee.org/ 站点,我会得到这个结果:

window.App = {
  Models: {},
  Views: {},
  Collections: {},
  Routers: {},
  init: function() {
    return Backbone.history.start();
  }
};

后者似乎更值得期待。我认为这可能会在我的项目中引起一些问题,但不能说。我知道当我调用 App.init() 时,我的 JavaScript 控制台说它不存在。感谢您的帮助!

已修复!

正如@Rob W 在下面指出的那样,我的咖啡脚本代码中有一些标签。后来我发现这是因为我全新安装了 TextMate 并且没有将其设置为“软标签(空格)”。

【问题讨论】:

  • Coffeescript 不是 JavaScript。学习 javascript。
  • 不确定我的帖子中的什么让你认为我认为 coffeescript 是 javascript?

标签: javascript coffeescript


【解决方案1】:

您的“本地”和“在线”结果有两个区别。

  1. 本地版本被封装在一个闭包中。
  2. 本地版本的init 方法在App 之外悬空。

额外的闭包是coffee 编译器的默认行为。使用--bare 标志不摆脱包装器:

coffee --bare --compile app.coffee

没有理由发生 2。确保空格匹配:如果在 Models 等之前有四个前面的空格,在 init 之前有三个空格,那么输出将是“错误的”。

【讨论】:

  • +1 感谢 Rob W。发生了一些奇怪的事情,我正试图弄清楚。我在想从 js 到咖啡网站的结果(第二个 js 结果)是预期的,而不是我本地咖啡调用产生的第一个结果。我会按照你的建议尝试
  • 我试过 --bare 并且它确实摆脱了闭包,但仍然存在主要区别,似乎调用 App.init() 时 init 函数不可用
  • @botbot 你的问题中的输入/输出不匹配,导致提示你复制源时出错。悬空input 方法的最可能原因是缩进错误(准确地说,至少少了一个空格)。
  • 似乎无论我如何更改 app.coffee、选项卡、空格,我仍然会得到一个位于 window.App 命名空间之外的 init 函数,我打算将它放在...
  • 邮件对话摘要:app.coffee 包含混合的空格和制表符,这会导致错误,如答案中所述。 切勿将制表符与空格混用!