关于这个/ @在Javascript / Coffeescript中的一个难题

前端之家收集整理的这篇文章主要介绍了关于这个/ @在Javascript / Coffeescript中的一个难题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_1@我正在研究Trevor Burnham的CoffeeScript书,我遇到了关于这个/ @的奇怪谜题.这个谜题有几个部分(我可能只是非常困惑),所以我会尽量让它尽可能清楚.

@H_301_1@我遇到的主要问题是,我通过不同的REPL和解释器运行相同的代码会得到各种不一致的结果.我正在测试(1)咖啡REPL和解释器,(2)Node的REPL和解释器以及(3)v8的REPL和解释器.

@H_301_1@这是代码,首先是Coffeescript然后是Javascript

@H_301_1@

  1. // coffeescript
  2. setName = (name) -> @name = name
  3. setName 'Lulu'
  4. console.log name
  5. console.log @name
  6. // Javascript via the coffee compiler
  7. (function() {
  8. var setName;
  9. setName = function(name) {
  10. return this.name = name;
  11. };
  12. setName('Lulu');
  13. // console.log for node below - print for v8
  14. // uncomment one or the other depending on what you're trying
  15. // console.log(name);
  16. // console.log(this.name);
  17. // print(name);
  18. // print(this.name);
  19. }).call(this);
@H_301_1@结果如下:

@H_301_1@

  1. $coffee setName.coffee
  2. Lulu
  3. undefined
  4. # coffee REPL
  5. # This appears to be a bug in the REPL
  6. # See https://github.com/jashkenas/coffee-script/issues/1444
  7. coffee> setName = (name) -> @name = name
  8. [Function]
  9. coffee> setName 'Lulu'
  10. 'Lulu'
  11. coffee> console.log name
  12. ReferenceError: name is not defined
  13. at repl:2:1
  14. at Object.eval (/Users/telemachus/local/node-v0.4.8/lib/node_modules/coffee-script/lib/coffee-script.js:89:15)
  15. at Interface.

因此,我认为真正的问题是:(1)我应该得到什么结果?(2)为什么这些解释器和REPL不能相处? (我的理论是v8是正确的:在全局上下文名称和this.name应该是相同的东西,我会想.但我已经准备好相信我在Javascript中不理解这一点.)

编辑:如果我在调用setName之前添加this.name = null / @ name = null(如下面的Pointy所示),那么Coffeescript和Node会给我’Lulu’和’null’,但是v8仍然会返回’Lulu’. (v8在这里对我来说更有意义.我最初在全局上下文中将name设置为null,但是setName将它(在全局上下文中)设置为’Lulu’.所以之后,这就是我应该在那里看到的.)

最佳答案
所以,首先,有一个关于CoffeeScript REPL,issue 1444错误,我在Telemachus引起我的注意后报告了这个错误.

@H_301_1@但是这里更有趣的问题(以及我在my CoffeeScript book中需要注意的问题)是,这在Node.js模块的最外层范围内并不是全局的 – 它是该模块的导出.试试这个:

@H_301_1@

  1. console.log this is exports
  2. console.log do -> this is global
@H_301_1@当您在Node模块中运行该代码时,您会发现两个语句都评估为true.这就是为什么name和@name会评估不同的东西:name本身总是指向global.name,除非它在var name声明的范围内;但@name只会指向全局上下文中调用函数中的global.name(默认值).在Node.js模块中,在任何函数之外,它将指向exports.name.

猜你在找的JavaScript相关文章