【问题标题】:Global variable is not updated全局变量未更新
【发布时间】:2012-08-17 12:10:37
【问题描述】:

我是coffeescript 的新手。而我又掉进了 JavaScript 的变量作用域的坑里。

我正在尝试使用node.js 开发简单的控制台脚本,没有类(还),最少的函数式编程糖(还)。就是这样:

fs      = require 'fs'
code    = "test"

fs.readFile 'COD99000430.TXT', (err, contents) ->
    code = contents.toString()

console.log code

它编译为以下 JavaScript:

// Generated by CoffeeScript 1.3.3
(function() {
  var code, fs;

  fs = require('fs');

  code = "test";

  fs.readFile('COD99000430.TXT', function(err, contents) {
    return code = contents.toString();
  });

  console.log(code);

}).call(this);

问题是在运行代码控制台后只显示单词test,这显然是code 变量的初始值。但我希望看到COD99000430.TXT 文件的内容。实际上我可以看到它,如果我将console.log code 放在fs.readFile 调用中的匿名回调函数的范围内。

我查看了coffieescript documentation 并描述了完全相同的情况。但由于某种原因,它对我不起作用。

我在 Windows 7 上使用 node.js 0.8.2 版,coffeescript 1.3.3 版。

在我的情况下是否可以有“全局脚本”变量?我如何通过咖啡脚本实现这一目标?

【问题讨论】:

  • 这实际上与变量范围或咖啡脚本无关。它是关于回调和 javascript 单线程事件循环的。您提供给fs.readFile 的回调将在文件内容被读取后执行。 fs.readFile 之后的代码将在调用 fs.readFile 之后立即执行,即在您的回调执行之前。
  • 哦...我明白了...欢迎来到node.js...谢谢您的提示!
  • @shytikov 这不是关于 node.js,而是关于 javascript 和异步操作。
  • 更多关于习惯异步思维的信息,我想说。老shell脚本作家应该改变他的态度。

标签: javascript node.js coffeescript scope


【解决方案1】:

你的问题的cmets是正确的,我只是想我会提供一些工作代码。

示例 1:只需在 fs.readFile 回调中记录文件内容。

fs = require 'fs'

fs.readFile 'COD99000430.TXT', (err, contents) ->
  console.log contents.toString()

示例 2:将文件处理代码分解为函数并提供回调以打印内容。

fs = require 'fs'

processFile = (filename, callback) ->
  fs.readFile filename, (err, contents) ->
    callback contents.toString()

processFile 'COD99000430.TXT', (data) -> console.log data

【讨论】:

  • hm...我之前尝试过的第一个示例,它有效。但第二个,我不知道callback 关键字。是来自 CoffeeScript 还是 JavaScript?您能给我提供文档链接吗?我试图找到一些东西,但似乎搜索结果与callback 函数混淆了..
  • @shytikov:不,callback 不是关键字。它只是一个参数,就像示例中的filename。你也可以叫它peter——但习惯上叫它callbacknext
【解决方案2】:

我稍微修改了你的代码,这样我就可以让它在 jsfiddle 中运行(不得不放弃 node,因为它没有安装在这台机器上)。我认为您需要将 readFile 行更改为函数,然后稍后调用该函数。

code = "test"

read = (err, contents) ->
    code = "XZY".toString()

console.log code
alert(code)

code = read()
alert(code)  

全局变量被认为是“应避免的”。您链接到的咖啡脚本页面确实有一个替代方案:

如果您想创建顶级变量供其他脚本使用, 将它们作为属性附加到窗口或导出对象中 通用JS。存在运算符(如下所述)为您提供 找出在哪里添加它们的可靠方法;如果您同时针对两者 CommonJS 和浏览器:导出?这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多