JS 怎么将 function 中的局部变量输出到全局变量

2016-07-24 16:16:49 +08:00
 cstome
//具体代码:
var listArr
var getList = new XMLHttpRequest();
getList.onreadystatechange = function () {
if (getList.readyState == 4 && getList.status == 200) {
var listObj = JSON.parse(getList.responseText);
listArr = listObj;
console.log(listArr); //此处输出的是 XHR 获得的内容
}
};
getList.open("GET", "list.json", true);
getList.send();
console.log(listArr); //此处输出 undefined
8797 次点击
所在节点    JavaScript
17 条回复
morethansean
2016-07-24 16:18:24 +08:00
这哪是局部变量还是全局变量, xhr 是异步的你 send 之后代码又不会停住等你取结果。
ljbha007
2016-07-24 16:22:02 +08:00
楼主需要理解一下 js 中的异步操作是什么意思
cstome
2016-07-24 17:03:50 +08:00
@morethansean 嗯,那么要怎样实现我想要的功能,可以给个思路吗?
eastpiger
2016-07-24 17:14:09 +08:00
这个应该已经是全局了吧。然而重点在于异步的话, log 的时候并没有执行到赋值的地方呢
learnshare
2016-07-24 17:15:45 +08:00
xhr 是基于事件来处理结果的,也就是 xhr 会在拿到结果之后,调用你绑定的事件监听函数。
shiye515
2016-07-24 17:15:50 +08:00
@cstome getList.open("GET", "list.json", false);
SoloCompany
2016-07-24 17:20:22 +08:00
xhr 可以用 async:false 但这是 deprecated 的功能用了是自寻死路,还是老老实实去学一下怎么用异步吧
caomu
2016-07-24 17:48:28 +08:00
function nextStep(result){console.log(result)}

getList.onreadystatechange = function () {
……
nextStep(listArr)
……}
cstome
2016-07-24 17:52:38 +08:00
@caomu 这样的话 listArr 就变成 nextStep 的局部变量了。。
surgit
2016-07-24 18:31:07 +08:00
@cstome 局部变量是相对的, 如果一个变量 a 可以在 function b 里总是取的到 你就可以把他当作类似全局的来用呀.
EchoWhale
2016-07-24 18:31:11 +08:00
你已经将 xhr 的结果输出到全局变量了。
之所以你得到了 undefined ,是因为你在 xhr 获得结果并将结果赋值给 listArr 之前访问了全局变量 listArr
horizon
2016-07-24 20:08:31 +08:00
这和全局变量,局部变量没关系。是异步的问题。。
sensui7
2016-07-24 20:26:17 +08:00
给 onreadystatechange 的处理函数一个回调参数,把你的操作挪到回调函数里去
cs419
2016-07-24 21:48:14 +08:00
首先第一行应该是 [listArr = 1;] 之后可以看到 listArr 是否改变。
其次既然是全局的, var 就可以省略了。
最后所有语句都执行完成后,在浏览器控制台再次运行 [console.log(listArr);]
will0404
2016-07-25 09:07:41 +08:00
为什么一定要附到全局上呢 看你的需求不需要这么做啊 你只是不懂异步 要搞清楚 js 中蛋疼的流程控制
miaotaizi
2016-07-25 09:49:49 +08:00
用回调函数解决.
xcodebuild
2016-07-25 10:00:43 +08:00
。。。随便找本小书看看。。编程不是靠猜的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/294570

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX