【问题标题】:Lack of implicit this in coffeescript在咖啡脚本中缺乏隐含的 this
【发布时间】:2026-01-05 01:10:01
【问题描述】:

这是我的咖啡脚本代码。

class Hello
  constructor: ->
    @greetings()
    this.greetings()
    greetings()

  greetings: ->
    alert 'hello world'

new Hello

这段代码翻译成

var Hello;

Hello = (function() {

  function Hello() {
    this.greetings();
    this.greetings();
    greetings();
  }

  Hello.prototype.greetings = function() {
    return alert('hello world');
  };

  return Hello;

})();

new Hello;

在咖啡脚本代码的第三种情况下,我既没有使用@,也没有使用this。我假设咖啡脚本会使用隐含的 this,但事实并非如此。

我做了一个快速的谷歌搜索,但没有得到任何结果。那么任何人都可以确认coffeescript不支持隐式this。

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    Coffeescript 不支持隐式this。主要是因为咖啡脚本实际上只是 javascript 的糖,而在 javascript 中这将是一个非常糟糕的主意,因为函数是第一类对象并且可以分配给局部变量。

    那么如何访问局部变量呢?

    a = -> 123
    @a = -> 456
    
    // normal coffeescript
    a() # 123
    
    // with implicit this
    a() # 123 or 456? Impossible to know.
    

    重要的是要记住,在 java 脚本中 var a;this.a 彼此没有关系,并且始终是 2 个单独的变量。知道什么时候你在处理什么是真正重要的。

    最后,这就是创建 @ 符号的原因。当在 javascript 中使用基于类的样式时,到处引用 thisthis.propName 的属性变得非常普遍。 @ 已添加到咖啡脚本中,以这种方式编程时不会那么乏味和烦人。

    【讨论】: