【问题标题】:functions in coffee-file are not available from other js其他 js 无法使用咖啡文件中的函数
【发布时间】:2013-10-12 17:28:48
【问题描述】:

我尝试在我的 Grails 项目中使用 coffeescript。为了实现这一点,我决定使用 coffeescript-resources 插件。但是结果视图中的已编译咖啡如下所示:

(function() {
    var someFunc;
    someFunc = function() {
       return alert("hello");
    };
}).call(this); 

在这种情况下,我不能调用它。我没有在插件文档中找到任何适当的配置来避免在编译咖啡文件时使用匿名函数。我该如何解决这个问题?

【问题讨论】:

  • 对此功能 (--bare) 和许多其他事情有一个拉取请求,但插件作者停止了它的工作。所以,我建议你使用独立的命令行编译来代替咖啡脚本。

标签: grails coffeescript scope coffeescript-resources


【解决方案1】:

来自fine manual

词法作用域和变量安全
[...]
尽管为了清楚起见在本文档中被隐藏,但所有 CoffeeScript 输出都包装在一个匿名函数中:(function(){ ... })(); 这个安全包装器,结合自动生成 var 关键字,使得意外污染全局命名空间变得非常困难。

如果您想创建顶级变量供其他脚本使用,请将它们作为属性附加到 window 或 CommonJS 中的 exports 对象上。 existential operator(如下所述)为您提供了一种可靠的方法来确定在何处添加它们;如果您同时针对 CommonJS 和浏览器:exports ? this

因此存在自调用函数包装器以防止您污染全局命名空间。如果你想把一些东西放到全局命名空间中,那么你必须明确地把它放在那里;在浏览器中,您可以使用:

window.someFunc = -> alert('hello')

@someFunc = -> alert('hello')

@someFunc 表单假定您位于范围的顶部(即不在另一个函数或类中)。

或者,您可以找到一种使用 --bare 编译 CoffeeScript 的方法:

-b, --bare
在没有顶级函数安全包装器的情况下编译 JavaScript。

【讨论】:

  • PS:如果有人能找到这个问题的规范答案,请告诉我,我会删除这个答案并将问题标记为重复。今天早上我的搜索功能似乎很弱。
  • 非常感谢!决定给窗口附加功能
  • 这通常比在构建过程中使用 --bare 更好。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2013-11-21
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
相关资源
最近更新 更多