Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 全局变量未更新_Javascript_Node.js_Coffeescript_Scope - Fatal编程技术网

Javascript 全局变量未更新

Javascript 全局变量未更新,javascript,node.js,coffeescript,scope,Javascript,Node.js,Coffeescript,Scope,我不熟悉coffeescript。我陷入了JavaScript变量作用域的陷阱 我正在尝试用node.js开发简单的控制台脚本,没有类(还没有),函数式编程最少(还没有)。下面是: fs=需要“fs” code=“测试” fs.readFile“COD99000430.TXT”(错误,内容)-> 代码=contents.toString() console.log代码 它编译为以下JavaScript: //由CoffeeScript 1.3.3生成 (功能(){ var代码,fs; fs=要

我不熟悉
coffeescript
。我陷入了JavaScript变量作用域的陷阱

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

fs=需要“fs”
code=“测试”
fs.readFile“COD99000430.TXT”(错误,内容)->
代码=contents.toString()
console.log代码
它编译为以下JavaScript:

//由CoffeeScript 1.3.3生成
(功能(){
var代码,fs;
fs=要求('fs');
code=“测试”;
fs.readFile('COD99000430.TXT',函数(err,contents){
返回代码=contents.toString();
});
控制台日志(代码);
}).打电话(这个);
问题是,在运行代码控制台后,只显示单词
test
,这显然是
code
变量的初始值。但我希望看到
COD99000430.TXT
文件的内容。实际上我可以看到它,如果我把
console.log code
放在
fs.readFile
调用中匿名回调函数的范围内

我已经看过了,并且描述了完全相同的案例。但出于某种原因,它对我不起作用

我在Windows7上使用的是
node.js
0.8.2版,
coffeescript
1.3.3版


在我的例子中是否可能有“全局脚本”变量?如何通过coffeescript实现这一点?

我对您的代码进行了一些修改,以便使其在JSFIDLE中运行(由于此计算机上未安装节点,因此不得不放弃该节点)。我认为您需要将readFile行更改为函数,然后稍后调用该函数

code = "test"

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

console.log code
alert(code)

code = read()
alert(code)  
全局变量被认为是“要避免的”。但是,您链接到的coffeescript页面确实有一个替代选项:

如果要创建顶级变量供其他脚本使用, 将它们作为属性附着在窗口或中的导出对象上 CommonJS。存在运算符(如下所述)为您提供 找出在何处添加它们的可靠方法;如果你的目标是两者 CommonJS和浏览器:导出?这个


关于您的问题的评论是正确的,我只是想提供一些工作代码

示例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

实际上,这与变量范围或coffeescript无关。它是关于回调和javascript单线程事件循环的。读取文件内容后,将执行提供给
fs.readFile
的回调。调用
fs.readFile
后,即在执行回调之前,将立即执行
fs.readFile
后面的代码。哦。。。我懂了。。。欢迎来到
node.js
。。。谢谢你的提示@shytikov它不是关于node.js的,它是关于javascript和异步操作的。我想说,更多的是关于习惯异步思维。老编剧应该改变他的态度。。。我以前试过的第一个例子,它是有效的。但是第二个,我不知道
callback
关键字。它是来自CoffeeScript还是JavaScript?你能给我提供文件的链接吗?我试图找到一些东西,但似乎搜索结果被
回调
函数弄乱了。@shytikov:不,
回调
不是关键字。它只是一个参数,就像示例中的
filename
。你也可以叫它
peter
——但习惯上叫它
callback
next