2

所以我对咖啡脚本相当陌生,必须相当快地学习它才能找到一份新工作。以下代码之间有什么区别:

class Person

相对

class @Person

如果我使用以下

bob = new Person() 

结果会有什么不同?

4

2 回答 2

0

@是为了this所以class @Person编译为this.Person = ...

你可以在coffeescript.org/#try查看编译后的 JS 是什么样子。

于 2013-11-12T15:19:01.023 回答
0

如果您查看class Cclass @C生成的完整 JavaScript,事情应该会更清楚。class C变成(经过一些清理):

(function() {
  var C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

所以C“类”实际上是自调用函数 (SIF) 包装器中的局部变量。这个包装器是 CoffeeScript 处理范围的一部分:

尽管为了清楚起见在本文档中被隐藏,但所有 CoffeeScript 输出都包装在一个匿名函数中: (function(){ ... })();这个安全包装器与var关键字的自动生成相结合,使得意外污染全局命名空间变得极其困难。

如果我们查看class @C,我们会看到几乎相同的内容:

(function() {
  this.C = (function() {
    function C() {}
    return C;
  })();
}).call(this);

区别在于var C(局部变量)与this.C(无论this是什么的属性)。

那么thisSIF里面有什么?this内部将是外部的任何内容:

(function() { ... }).call(this)
// -----------------------^^^^

因为call用于调用 SIF。thisSIF 之外会有什么?window在浏览器中,它会class @C等价于class window.C并且属性window是全局可见的;因此class @CC在浏览器环境中全局可见,而 simpleclass C仅在定义它的文件中可见。

一种更常见的方法(至少在我使用过的代码中)是拥有一个全局可见的特定于应用程序的命名空间:

// Somewhere before anything else happens...
window.whatever_the_app_is_called = { };

然后你把你的类放在那个命名空间的某个地方:

class whatever_the_app_is_called.C
    #...

如果您使用的是 Require.js 或 node.js,那么它们有自己的命名空间模式供您使用。

于 2013-11-12T21:36:53.613 回答