在nodejs 回调函数 变量中为什么只能读取却不能修改外部的变量

本帖子已过去太久远了,不再提供回复功能。javascript 怎么在回调函数内,修改外部变量?
请大牛帮忙,万分感谢
想给变量数组填充内容,但是发现回调后,因为作用域的原因而没有改变原值
var list = new Array();
function get_time_line(){
var value = new Array();//value是一个空数组
list.forEach(function(key,i){
db.hget(key, 'time_line', function(err,reply) {
value[key]=
//这里想读取redis的相应值,给value填充内容
res.render('index', {value : value});
console.log(value);//但是输出却是空的[]
function get_Index(){
db.keys('tencent:uid:*', function (err, replies) {
replies.forEach(function (key, i) {
list.push(key);
get_time_line();
}请问怎么才能把value的值填充完后再调用?
你的操作都是异步的,所以在你获取value的填充内容的时候,值还没有填进去。你需要一个异步同步化的模块,或者是成组异步执行完毕后回调的模块来辅助你。例如:http://www./archives/1474不过我这个玩意比较老了,现在有一些比较通用的,例如Async.js /caolan/async
支持一下 虽然不懂!
Powered byC语言中为什么函数外只能初始化变量,不能给变量赋值
C语言中为什么函数外只能初始化变量,不能给变量赋值?
这是一种C的规定,还是这种做法可以用C的规则来证明了。
希望大家可以相互讨论,指导一下,谢谢
表示没明白你的意思。按说变量的初始化也是赋值
--- 共有 7 条评论 ---
: 今天写代码,在宏判断中,想给某个全局变量赋值,因为以前总是在定义的时候习惯赋初值,所以在给全局变量二次赋值造成编译不过。哈哈,现在懂了为什么。以后就不会在犯错了。
: 发现你总是问些很奇怪的问题,说实话这样调函数没什么意义
: 函数之外不能调用函数也是这个原因吧。如:
char str[20];
strcpy(str,"abcd");
报错: error: syntax error before string constant
: 是的,当时人们在开发编译器的时候想过你这样的问题,就是在全局区赋值。结果是这样做除了产生副作用之外,并没有任何意义,索性就不支持这样做了。不但如此,现在编程都不太推荐使用过多的全局变量了,因为耦合性太高
: 您说的可以理解为在函数外定义变量并赋值,其分配的内存在全局区,由于编译器实现机制,只能赋一次值,多次赋值会产生副作用吧。
现在有一点不理解,为什么int i=1;i=2;在函数外编译不过,放在函数里可以编译通过,难道是因为编译器对函数外的代码和函数里的代码处理是不一样的,如果不一样是哪里不一样(C语言的机制决定吗?)
万分谢谢。
引用来自“木兰宿莽”的评论表示没明白你的意思。按说变量的初始化也是赋值i=2;是可以的。是声明一个变量但不分配内存,i=2;表示分配内存并赋值为2。而你int i=1;就已经分配内存并赋值,你再来一个赋值,这会引起副作用的,一般语言规定上和编译器的实现上都是不行的
当时人们在开发编译器的时候想过这样的问题,就是在全局区赋值。结果是这样做除了产生副作用之外,并没有任何意义,索性就不支持这样做了。不但如此,现在编程都不太推荐使用过多的全局变量了,因为耦合性太高
另外注意,函数之外不能调用函数也是同样的道理在回调函数中为什么只能读取却不能修改外部的变量? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
// 1 在外面声明一个变量 cs
AV.Cloud.httpRequest({
// 2 一个 http 请求
url: 'http:///cnhp/coverstory',
mkt: 'zh-cn',
success: function (httpResponse) { // 3 这是成功时候的回调函数
cs = httpResponse. // 4 把 http 请求返回的内容给 cs 这个变量
error: function (httpResponse) {
console.error('Request failed with response code ' + httpResponse.status);
response.success(cs); // 5 在外面读取 cs 变量
为什么当第五步读取cs变量时读取的是第一步的cs,而看起来cs变量没有被第4步修改?
如果我将第5步这一行移到第4步的那一行后面,也就是在函数内,就可以读取到修改后的cs。
如何实现回调函数修改外部的变量并可以被外部读取?
JS小白,可能问得不好,请多指点,谢谢!
你把异步当同步,5执行时,4还没有执行
楼上说得对,你可以在success里,cs赋值后打印出来就明白了
异步编程的同步思想:)
node的特点 异步,http还没回来呢就已经response了
node还没入门呀~加油咯
你在外面加个setTimeout之类的延迟加载方法输出这个cs试试、
其实值已经改变了,但是当执行response.success(cs)的时候,回调函数还没有真正的赋值,也就是说这个回调函数仅仅是声明了一个子线程,放入到了线程池执行,我们的观察者在观察到这个数据改变进行回传的时候,已经执行了response.success(cs),而这个时候cs的值是没有改变的。
也不知道我解释清楚没有…
楼主知道解决方法了吗,我也有相同需求
httpRequest执行了后,需要等待反馈信息才会执行回调,但是在JS的异步编程中,httpRequest执行完后(还没得到反馈)就会立刻执行下面的response。等到反馈信息回来了,才会执行这个回调。
异步改成同步
异步编程的同步思想:)
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的JavaScript闭包函数访问外部变量的方法
作者:琼台
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了JavaScript闭包函数访问外部变量的方法,本文使用匿名函数来实现在闭包中访问外部变量,需要的朋友可以参考下
闭包是指有权访问另一个函数作用域中的变量的函数,但作用域的配置机制有一个需要注意的地方,即闭包只能取得包含函数中任何变量的最后一个值。
如以下案例:
function create(){
&&&&var arr = new Array();&
&&&&for (var i=0; i&10; i++){
&&&&&&&&arr[i] = function(){
&&&&&&&&&&&&
&&&&&&&&};&
var c_arr = create();
for(var i=0; i&c_arr.i++){
&&&&document.write("c_arr["+i+"] = "+c_arr[i]()+"&br /&");&&&
执行结果:
表面上看,似乎每个函数返回的i值都不相同,比如c_arr[0]的值应该是0,c_arr[1]的值应该是1,以此类推。可结果每个函数都返回10。为什么呢?
因为每个函数的作用域链中保存着create()函数的活动对象,所以它们引用的都是同一个变量i。当for循环结束以后,i的值也就变成10了,此时每个函数都引用保存变量i的同一个变量对象。
我们可以通过创建另一个域名函数强制让闭包的行为符合预期,使每个位置对应相应的值。
function create(){
&&&&var arr = new Array();&
&&&&for (var i=0; i&10; i++){
&&&&&&&&arr[i] = function(num){
&&&&&&&&&&&&return function(){
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&};
&&&&&&&&}(i);&&
var c_arr = create();
for(var i=0; i&c_arr.i++){
&&&&document.write("c_arr["+i+"] = "+c_arr[i]()+"&br /&");&&&
执行结果:
定义了一个匿名函数,并立即执行匿名函数的机过赋给数组,这里匿名函数有一个参数num,也就是最终的函数要返回的值。在调用每个函数时我们传入变量i。由于函数参数是按值传递的,所以就会将变量i的当前值赋值给参数num。而在这个匿名函数内部,又创建并返回了一个访问num的闭包,这样一来arr数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自不同的数值了。
我们再来看一个经典的例子,假设页面有一组button标签,我们利用脚本给这组button标签绑定单击事件,并且单击时能弹出这是第几个标签。
&meta charset="utf-8" /&
&button&第一个&/button&
&button&第二个&/button&
&button&第三个&/button&
&button&第四个&/button&
&script type="text/javascript"&
var obj = document.getElementsByTagName('button');
for(var i=0;i&obj.i++){
&&&&obj[i].onclick = function(){
&&&&&&&&alert(i);
点击每一个按钮结果
表面上看,似乎单击每一个标签应该弹出不同数字
第一个应该弹出0;
第二个应该弹出1;
以此类推。
可结果是所有按钮都弹出4,显然这不是我们想要的结果。
我们把程序改一下
&meta charset="utf-8" /&
&button&第一个&/button&
&button&第二个&/button&
&button&第三个&/button&
&button&第四个&/button&
&script type="text/javascript"&
var obj = document.getElementsByTagName('button');
for(var i=0;i&obj.i++){
&&&&obj[i].onclick = function(num){
&&&&&&&&return function(){
&&&&&&&&&&&&alert(num);
&&&&&&&&}&&&&&&
&&&&}(i);&&&&&&
点击第二个
点击第四个
我们只需要在函数内建立一个匿名函数,同以上案例同理。即可实现匿名函数捕获外部变量i,结果每个按钮弹的i值都不同。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 nodejs 回调函数 变量 的文章

 

随机推荐