为啥 coffescript 创建这个闭包 [重复]

Posted

技术标签:

【中文标题】为啥 coffescript 创建这个闭包 [重复]【英文标题】: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 未定义,因为它在闭包中 ***.com/questions/4214731/… 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

更改一个类的位声明

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

【讨论】:

这是让它在coffee中工作的正确方法吗?

以上是关于为啥 coffescript 创建这个闭包 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

关于闭包

为啥这个javascript函数失去了闭包范围?

为啥这个闭包不能访问 'this' 关键字? - jQuery

为啥 Resharper 将此标记为“访问修改后的闭包”?

为啥这个 python 闭包不起作用?

为啥速记参数名称在这个 Swift 闭包中不起作用?