无法修改Coffeescript';在JQuery侦听器中设置全局变量

无法修改Coffeescript';在JQuery侦听器中设置全局变量,coffeescript,global-variables,jquery,Coffeescript,Global Variables,Jquery,今天我把我的一些javascript代码迁移到coffeescript中,陷入了一件非常愚蠢的事情,尽管我不知道如何让它工作 我想在触发单击事件时更新全局变量的值,请查看下面的代码以了解我的猜测 这是密码 @activeObject = null # Some other code $ -> $('#header').click -> if !headerSelected showMenu '#header-menu', event else

今天我把我的一些javascript代码迁移到coffeescript中,陷入了一件非常愚蠢的事情,尽管我不知道如何让它工作

我想在触发单击事件时更新全局变量的值,请查看下面的代码以了解我的猜测

这是密码

@activeObject = null

# Some other code

$ ->
  $('#header').click ->
    if !headerSelected  
      showMenu '#header-menu', event
    else
      @activeObject = "#header"
      showMenu '#menu-style-header', event
不幸的是,即使触发了click事件,变量也没有得到更新

我想出了一个解决办法。我创建了一个函数来设置变量的值并调用它而不是赋值,这次它成功了


我只是想知道为什么我不能用另一种方式。对我来说,这是一个简单的操作,仅仅为此定义一个新函数似乎很愚蠢。

您的问题是单击处理程序内部的
@
(又称
)与外部的不同,因此:

@activeObject = null
这是:

@activeObject = "#header"
是指两个不同的
activeObject
s。您应该能够使用
=>
绑定所有内容,以获得正确的

$ =>
  $('#header').click =>
    #...
或者更好(IMHO),只需在两个位置直接引用
window.activeObject
,这样每个人都可以清楚地看到您引用的是全局变量:

window.activeObject = null
$ ->
  $('#header').click ->
    if !headerSelected  
      showMenu '#header-menu', event
    else
      window.activeObject = "#header"
      showMenu '#menu-style-header', event
或者,您可以完全停止使用globals,转而使用数据属性:

$ ->
  $('#header').data 'activeObject', null
  $('#header').click ->
    if !headerSelected  
      showMenu '#header-menu', event
    else
      $(@).data 'activeObject', '#header'
      showMenu '#menu-style-header', event

您的问题是,单击处理程序内部的
@
(又称
this
)与外部的不同,因此:

@activeObject = null
这是:

@activeObject = "#header"
是指两个不同的
activeObject
s。您应该能够使用
=>
绑定所有内容,以获得正确的

$ =>
  $('#header').click =>
    #...
或者更好(IMHO),只需在两个位置直接引用
window.activeObject
,这样每个人都可以清楚地看到您引用的是全局变量:

window.activeObject = null
$ ->
  $('#header').click ->
    if !headerSelected  
      showMenu '#header-menu', event
    else
      window.activeObject = "#header"
      showMenu '#menu-style-header', event
或者,您可以完全停止使用globals,转而使用数据属性:

$ ->
  $('#header').data 'activeObject', null
  $('#header').click ->
    if !headerSelected  
      showMenu '#header-menu', event
    else
      $(@).data 'activeObject', '#header'
      showMenu '#menu-style-header', event

我认为混淆是关于
@
的用法,这基本上只是一个快捷方式。 如果您编译代码并查看它生成的CoffeeScript编译器,那么混淆就会变得很清楚

this.activeObject = null;

$(function() {
  return $('#header').click(function() {
    if (!headerSelected) {
      return showMenu('#header-menu', event);
    } else {
      this.activeObject = "#header";
      return showMenu('#menu-style-header', event);
    }
  });
});
如果activeObject是全局的,您可以引用它

window.activeObject=null

window.activeObject=“#header”

在这段代码中的两种情况下,可能会尝试在第二次出现时在没有窗口的情况下使用它,但这将导致新的局部变量被错误地定义

一般来说,在开始使用CoffeeScript时,尝试像这样的小鹬类是很有用的
立即试用
选项卡上

我认为混淆之处在于
@
的用法,这基本上只是一种快捷方式。 如果您编译代码并查看它生成的CoffeeScript编译器,那么混淆就会变得很清楚

this.activeObject = null;

$(function() {
  return $('#header').click(function() {
    if (!headerSelected) {
      return showMenu('#header-menu', event);
    } else {
      this.activeObject = "#header";
      return showMenu('#menu-style-header', event);
    }
  });
});
如果activeObject是全局的,您可以引用它

window.activeObject=null

window.activeObject=“#header”

在这段代码中的两种情况下,可能会尝试在第二次出现时在没有窗口的情况下使用它,但这将导致新的局部变量被错误地定义

一般来说,在开始使用CoffeeScript时,尝试像这样的小鹬类是很有用的 在
上,立即尝试
选项卡