coffeescript变量赋值的范围vs对象的其他属性中的属性赋值

时间:2014-12-07 17:32:21

标签: coffeescript scope

我正在为Ubersicht编写一些小部件。它使用node.js服务器并将每个.coffee文件视为独立的窗口小部件对象。我在定义要在整个文件中使用的常量设置时遇到问题。目前我知道有两种方法可以在文件顶部定义这种类型的常量。

# Way 1
foo_1 = true
bar_1 = false
# Way 2
foo_2: true
bar_2: false

在同一文件中,将属性指定为字符串或函数。以上两种定义选项的方法只适用于两种属性类型中的一种。

staticProperty: """Output #{foo_1} works here
but output of #{foo_2} doesn't work
"""

methodProperty: (input) -> 
  if foo_1 # Raises foo_1 is not defined
  if @foo_1 # foo_1 is undefined which is expected
  if @foo_2 # This works fine

我理解这种方式2添加到对象的属性,但我不太清楚1赋值的工作方式,因为该文件实质上是定义一个对象。你能解释一下吗?

还有一种方法可以定义一个可以从两个地方访问的变量吗?

1 个答案:

答案 0 :(得分:2)

我们会看一个很丑的例子来看看发生了什么:

class C
    a: 6
    b: @::a
    c = 11
    d: c
    @e = 23
    f: @e
    g: -> @a
    h: -> C::b
    i: -> c
    j: -> @constructor.e

a是一个普通的旧属性,在JavaScript中看起来像:

C.prototype.a = 6;

b也是附加到原型的普通旧属性;这里:

b: @::a

@是类本身所以在JavaScript中这是:

C.prototype.b = C.prototype.a

一切正常。

c是一种私有变量。在JavaScript中它看起来像这样:

var C = (function() {
  function C() {}
  var c = 11;
  //...
})();

我在此处添加了更多JavaScript上下文,以便您可以查看c的范围。 <{1}}在c的定义中可见,但在其他任何地方都不可见。

C是原型上的另一个属性,在JavaScript中看起来像这样:

d

此赋值发生在用于构建类的SIF包装器内,因此C.prototype.d = c 在此处可见。

var c = 11是一个类属性,在JavaScript中只是:

e

C.e = 23; 是原型上的另一个属性。 f在此上下文中就是类本身(就像在@中一样):

b

所以我们可以f: @e 作为e,JavaScript看起来像:

@e

C.prototype.f = C.e; g方法应该非常明确。 h方法有效,因为它是SIF内部用于定义i的闭包:

C

C.prototype.i = function() { return c; }; 方法有效,因为它使用标准constructor property返回j本身。

演示:http://jsfiddle.net/ambiguous/tg8krgh2/


将所有这些应用到您的情况中,

C

如果您正确引用了某些内容,我们会发现您可以使用这两种方法:

class Pancakes
  foo_1 = true
  foo_2: true

我不确定您为什么在staticProperty: """Output #{foo_1} works here and so does #{@::foo_2} """ methodProperty: (input) -> # foo_1 should work fine in here. # @foo_1 is undefined which is expected # @foo_2 works fine 内引用foo_1时遇到问题,它应该可以正常工作,does work fine使用当前版本的CoffeeScript。