【问题标题】:How can I translate this syntax to CoffeeScript (js2coffee doesn't work)?如何将此语法翻译成 CoffeeScript(js2coffee 不起作用)?
【发布时间】:2012-08-29 18:14:07
【问题描述】:

基本上我需要将下面这段 JavaScript 翻译成 CoffeeScript。

location.href = "javascript:(" + function() {
  window.onbeforeunload = function() {
    notifyBackground(collectData());
    return undefined;
  };
} + "){}";

返回“未定义”很重要,因为如果我删除它,浏览器会要求用户确认他们是否要离开页面。

你可能想知道我在做什么。基本上,它是一个location hack for Firefox extension development

我尝试过以下操作:

location.href = "javascript:(" + ->
  window.onbeforeunload = ->
    notifyBackground(collectData())
    return undefined
+ ")()"

但这会变成:

location.href = "javascript:(" + function() {
  return window.onbeforeunload = function(e) {
    notifyBackground(collectData());
    return void 0;
  };
};
return +")()";

使用js2coffee.org 给了我这个:

location.href = "javascript:(" + ->
  window.onbeforeunload = ->
    notifyBackground collectData()
    "undefined"
 + "){}"

如果我通过 CoffeeScript 运行它,我会得到这个 JS 输出(这是错误的)。

location.href = "javascript:(" + function() {
  return window.onbeforeunload = function() {
    notifyBackground(collectData());
    return "undefined";
  };
};
return +"){}";

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:

    这够近了吗?

    location.href = "javascript:(#{-> 
      window.onbeforeunload = -> 
        notifyBackground(collectData())
        `undefined`
      return
    }){}"
    

    编译为:

    location.href = "javascript:(" + (function() {
      window.onbeforeunload = function() {
        notifyBackground(collectData());
        return undefined;
      };
    }) + "){}";
    

    注意未定义周围的反引号以避免void 0,以防万一有所不同(我不确定它是否有效?)

    编辑

    在 Chrome 控制台中,undefined == void 0true,所以可能是

    `undefined`
    

    可能只是:

    undefined
    

    【讨论】:

      【解决方案2】:

      试试 this 网站 http://js2coffee.org/ 它是一个 js 到咖啡(和反向)转换器。

      【讨论】:

      • ... 这与您的第一次尝试给出了类似的答案,但没有return undefined
      • 但是,如果您通过 CoffeeScript 解释器运行 js2coffee.org 的输出,它会出现我在问题底部的 JS 代码。 return "undefined" 也很重要,因为如果我删除它,浏览器将用作确认他们想要离开页面。
      最近更新 更多