【问题标题】:Referencing non global variables across AMD modules in CoffeeScript在 CoffeeScript 中跨 AMD 模块引用非全局变量
【发布时间】:2014-07-06 13:25:56
【问题描述】:

我正在用 CoffeeScript 编写一个应用程序,其中主要对象声明如下:

App =
  Models: {}
  Views: {}
  Collections: {}
  start: ->
    console.log('started')
    null

require ['models/question', 'views/question'], ->
  new App().start()
  null

这段代码编译成这样的javascript:

(function() {
  var App;
  App = {
    Models: {},
    Views: {},
    Collections: {},
    start: function() {
      console.log('started');
      return null;
    }
  };

  require(['models/question', 'views/question'], function() {
    new App().start();
    return null;
  });

}).call(this);

在该程序的“必需”模型代码中,Coffeescript 及其编译如下所示:

#Coffeescript
    App.Model.Question = Backbone.Model.extend(
      defaults : ->
        question: "How're you"
    )


//Javascript

(function() {
  App.Model.Question = Backbone.Model.extend({
    defaults: function() {
      return {
        question: "How're you"
      };
    }
  });

}).call(this);

由于coffeescript 的编译方式,编译后的代码中没有全局变量。因此,当 Question 模型页面加载时,它会引发错误:在浏览器控制台中:

Uncaught ReferenceError: App is not defined

我不确定如何解决这个问题,因为我的项目中的模块之间会有很多引用。如何确保跨模块的可见性 - 在使用咖啡脚本时。

【问题讨论】:

    标签: coffeescript requirejs


    【解决方案1】:

    通过将-b--bare 标志传递给编译器,“在没有顶级函数安全包装器的情况下编译JavaScript”。 See Usage section of documentation

    【讨论】:

    • 谢谢!你知道安全包装是干什么用的吗?
    【解决方案2】:

    您可以将其设置为全局或“命名空间”,只需将其放在那里即可。

    window.MyNamespace = {}
    window.MyNamespace.App = App
    

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 2021-06-26
      • 2017-06-02
      • 2013-07-19
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多