【问题标题】:DIfference in Compilation of CoffeScipt Files to JSCoffeScipt 文件编译成 JS 的区别
【发布时间】:2017-01-10 12:19:17
【问题描述】:

在从 ruby​​ 脚本编译咖啡脚本文件时,

来自我的应用程序的示例代码,

$( () =>
  rest_api_login((login_ok, userName, userRoles) ->
    console.log("login_ok #{login_ok}, userName #{userName}, roles [#{userRoles.join(", ")}]")
    vcm.app.userName = userName
    vcm.app.userRoles = userRoles
    vcm.app.defaultClassifications = []
    initialize_templates((loaded_templates) ->
      console.log("loaded_templates", loaded_templates)
      vcm.app.main_application()
    )
  )
)

所以,在编译成 js 的时候,还是有区别的。 最后提交的代码大约是 2-3 年前,开发人员不在编译最后一个文件的公司。 编译的变化很少,例如:a!=b 现在编译为 !(a==b),所以编译方式没什么大不了的。

所以,在我编译的文件中,输出的js文件是:

$(function() {
    return rest_api_login(function(login_ok, userName, userRoles) {
      console.log("login_ok " + login_ok + ", userName " + userName + ", roles [" + (userRoles.join(", ")) + "]");
      vcm.app.userName = userName;
      vcm.app.userRoles = userRoles;
      vcm.app.defaultClassifications = [];
      return initialize_templates(function(loaded_templates) {
        console.log("loaded_templates", loaded_templates);
        return vcm.app.main_application();
      });
    });
  });

之前编译的文件有以下js:

$((function(_this) {
    return function() {
      return rest_api_login(function(login_ok, userName, userRoles) {
        console.log("login_ok " + login_ok + ", userName " + userName + ", roles [" + (userRoles.join(", ")) + "]");
        vcm.app.userName = userName;
        vcm.app.userRoles = userRoles;
        vcm.app.defaultClassifications = [];
        return initialize_templates(function(loaded_templates) {
          console.log("loaded_templates", loaded_templates);
          return vcm.app.main_application();
        });
      });
    };
  })(this));

所以我的 js 没有早期编译文件中存在的 return 语句和相应的 this 关键字。

这适用于超过 15000 行的完整 js 文件,

  1. 这种类型的影响会阻碍应用程序的功能吗?

  2. 如果我想生成和之前生成的一样的js怎么办?

我尝试用几乎所有版本的gem编译它,coffee-script,当前编译的版本是2.2.0。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript ruby coffeescript


    【解决方案1】:

    不同之处在于您的新代码使用fat arrow =>,而旧代码使用带有-> 的普通函数声明。用粗箭头表示,新声明的函数的this 必然是外部作用域的this。回调真的很有帮助。

    在这种情况下,胖箭头不会有任何效果,因为 this 没有被引用,并且传递给 rest_api_login 的回调定义了一个新的范围。这是不必要的,您应该将=> 替换为->。这将生成原始代码(没有小的语言更改)。

    【讨论】:

    • 主要问题是两个返回函数,我不想改胖箭头,因为一直都是这样,所以不是问题,虽然我明白你的意思.谢谢
    • 第二个返回函数(将内部_this 绑定到外部this)是不必要的,也是唯一的区别。较早编译的文件带有粗箭头,而您的不是(或已被优化掉)。参考文献gist.github.com/kba/db5b4495f9a03664e3cb8c68cb7bfd8d
    猜你喜欢
    • 2013-12-18
    • 2011-04-03
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2021-09-04
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多