2

我在 app/assets/javascripts/custom.js 中创建了一个带有函数定义的小型自定义 javascript 文件

round_number = function(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
};

该应用程序运行良好,因为该文件已插入到资产管道中。然后,出于学习目的,我将其转换为 coffescript:

round_number = (num, dec) ->
  Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec)

但令我惊讶的是,该应用程序不起作用。我在 localhost:3000/assets/custom.js 中检查了 coffescript 被翻译成:

(function() {
  var round_number;

  round_number = function(num, dec) {
    return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
  };

}).call(this);

为什么额外的包装,使功能在我需要的地方不可用?

如果我不是在 custom.js.coffee 文件中插入 coffescript 函数,而是在 app/assets/javascripts/orders.js.coffee (其中 Order 是我的类)中,它将被翻译成预期的 javascript。

我想把共享的 javascript 函数放在一个单独的文件中,因为它更有序。我知道,即使我将函数放在 orders.js.coffee 中,它也会在整个应用程序中可用(这就是我想要完成的),但我很困惑。我在这里缺少最佳实践吗?

- - 编辑 - -

我从Rails 3.1 和 Coffeescript 的“找不到变量”错误中了解到

我想我会以这种方式组织我的 Rails 应用程序:

1) 创建文件 app/assets/javascripts/global.js.coffee 以包含所有全局变量和函数。在这个文件中放一行

window.Global ||= {}

定义一个命名空间 Global。将函数定义为

Global.function_name = (arguments) ->
  ...

2)调用函数:

Global.function_name(arguments)
4

1 回答 1

0

是的,如果您想要全局可用的东西,请将其设置为window. Coffeescript 编译器将您的代码包装在一个匿名函数中,以防止意外的名称冲突。

于 2013-01-25T17:10:51.900 回答