0

是否有咖啡脚本的分组运算符?我试图把这个:

var urlParams;
(window.onpopstate = function () {
    var match,
        pl     = /\+/g,  // Regex for replacing addition symbol with a space
        search = /([^&=]+)=?([^&]*)/g,
        decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
        query  = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query))
       urlParams[decode(match[1])] = decode(match[2]);
})();

进入咖啡脚本。到目前为止我有这个,但我没有得到正确的

window.onpopstate = ->
  pl     = /\+/g  # Regex for replacing addition symbol with a space
  search = /([^&=]+)=?([^&]*)/g
  decode = (s) ->
    return decodeURIComponent(s.replace(pl, " "))
  query  = window.location.search.substring(1)

  urlParams = {};
  while (match = search.exec(query))
    urlParams[decode(match[1])] = decode(match[2]);

试图提醒,但得到urlParams is not defined

jQuery ->
  alert(urlParams['hair'])

可能是因为()函数末尾的我没有得到它?

4

1 回答 1

3

CoffeeScript 将在第一次赋值时在作用域中声明变量。urlParams由于您首先在 内分配onpopstate,因此它是在其中声明的,并且在外面无法访问。要复制 JavaScript 的行为,您必须在onpopstate处理程序之外对其进行初始化:

urlParams = null
window.onpopstate = ->
  # ...

请注意,这假设urlParams只能在该一个脚本中访问;由于 CoffeeScript 将所有内容都包装在一个 IIFE 中,并且urlParams会被困在其中,因此如果以这种方式声明,您将无法在外部访问它。如果您希望它真正是全局的,也可以从其他脚本访问,您需要将每次出现的地方都替换为window.urlParams.

不过还有一些其他的事情:

  1. JavaScript 版本的()末尾确实不在 CoffeeScript 版本中,尽管这不是导致您的问题的原因。幸运的是,在 CoffeeScript 中有一种非常简单的方法可以做到这一点,而无需添加一堆括号:使用do

    do window.onpopstate = ->
      # ...
    
  2. CoffeeScript 中不需要尾随分号。我会删除它们。

  3. return定义中的decode内容隐含在 CoffeeScript 中。我会删除它。

  4. 的条件周围不需要括号while。我会删除它们。

  5. 如果您愿意,可以利用 CoffeeScript 的不带括号的隐式函数调用,例如:

    while match = search.exec query
    

    还有其他几个地方你也可以应用这个,虽然为了可读性我只会在看起来合理的地方做。

于 2013-09-29T04:00:20.807 回答