【问题标题】:Why is coffescript creating this closure [duplicate]为什么 coffescript 创建这个闭包 [重复]
【发布时间】:2016-04-28 04:46:26
【问题描述】:

我正在学习 CoffeeScript 我有这个代码:

class Person
    constructor: (@firstName, @lastName) ->
    sayHi: () ->
        return "Hi, I'm #{@firstName} #{@lastName}"

并且正在生成这个 javascript 代码:

// Generated by CoffeeScript 1.10.0
(function() {
  var Person;

  Person = (function() {
    function Person(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
    }

    Person.prototype.sayHi = function() {
      return "Hi, I'm " + this.firstName + " " + this.lastName;
    };

    return Person;

  })();

}).call(this);

我想创建 class 的实例,但由于它在闭包内,我不能这样做?

【问题讨论】:

  • 你应该提到你正在使用node.js?
  • 我没有使用node。只是npm 用于安装一些软件包,但它现在只是前端应用程序
  • 我想对此运行 jasmine 测试,但是当我 require js 文件时,Person 未定义,因为它在闭包中

标签: javascript coffeescript


【解决方案1】:

@ 运算符(与 this 相同)是一个稍微不那么骇人听闻的选项。在浏览器环境中,this会指向window,在node.js中,会指向exports

class @Person
  constructor: (@firstName, @lastName) ->
  sayHi: () ->
    return "Hi, I'm #{@firstName} #{@lastName}"

window.Person 仅适用于浏览器,@ 将适用于节点和浏览器。见https://stackoverflow.com/a/24352630/227299

或者,您可以使用 -b (--bare) 选项运行 coffescript,并且不会创建包装函数。

【讨论】:

    【解决方案2】:

    更改一个类的位声明

    class window.Person
      constructor: (@firstName, @lastName) ->
      sayHi: () ->
        return "Hi, I'm #{@firstName} #{@lastName}"
    

    【讨论】:

    • 这是让它在coffee中工作的正确方法吗?
    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多