首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
V2EX  ›  JavaScript

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

  •  
  •   cstome · 2016-07-24 16:16:49 +08:00 · 6035 次点击
    这是一个创建于 1086 天前的主题,其中的信息可能已经有所发展或是发生改变。
    //具体代码:
    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
    第 1 条附言  ·  2016-07-24 17:55:35 +08:00
    问题确实出在 XHP 异步,那么问题改成“怎样把 XHR 获得的数据输出到全局变量?”。
    除了将 async:false 还有别的方法吗?
    17 回复  |  直到 2016-07-25 10:00:43 +08:00
        1
    morethansean   2016-07-24 16:18:24 +08:00
    这哪是局部变量还是全局变量, xhr 是异步的你 send 之后代码又不会停住等你取结果。
        2
    ljbha007   2016-07-24 16:22:02 +08:00
    楼主需要理解一下 js 中的异步操作是什么意思
        3
    cstome   2016-07-24 17:03:50 +08:00
    @morethansean 嗯,那么要怎样实现我想要的功能,可以给个思路吗?
        4
    eastpiger   2016-07-24 17:14:09 +08:00 via Android
    这个应该已经是全局了吧。然而重点在于异步的话, log 的时候并没有执行到赋值的地方呢
        5
    learnshare   2016-07-24 17:15:45 +08:00
    xhr 是基于事件来处理结果的,也就是 xhr 会在拿到结果之后,调用你绑定的事件监听函数。
        6
    shiye515   2016-07-24 17:15:50 +08:00
    @cstome getList.open("GET", "list.json", false);
        7
    SoloCompany   2016-07-24 17:20:22 +08:00
    xhr 可以用 async:false 但这是 deprecated 的功能用了是自寻死路,还是老老实实去学一下怎么用异步吧
        8
    caomu   2016-07-24 17:48:28 +08:00 via Android
    function nextStep(result){console.log(result)}

    getList.onreadystatechange = function () {
    ……
    nextStep(listArr)
    ……}
        9
    cstome   2016-07-24 17:52:38 +08:00
    @caomu 这样的话 listArr 就变成 nextStep 的局部变量了。。
        10
    surgit   2016-07-24 18:31:07 +08:00
    @cstome 局部变量是相对的, 如果一个变量 a 可以在 function b 里总是取的到 你就可以把他当作类似全局的来用呀.
        11
    EchoWhale   2016-07-24 18:31:11 +08:00 via Android
    你已经将 xhr 的结果输出到全局变量了。
    之所以你得到了 undefined ,是因为你在 xhr 获得结果并将结果赋值给 listArr 之前访问了全局变量 listArr
        12
    horizon   2016-07-24 20:08:31 +08:00
    这和全局变量,局部变量没关系。是异步的问题。。
        13
    sensui7   2016-07-24 20:26:17 +08:00 via iPhone
    给 onreadystatechange 的处理函数一个回调参数,把你的操作挪到回调函数里去
        14
    cs419   2016-07-24 21:48:14 +08:00
    首先第一行应该是 [listArr = 1;] 之后可以看到 listArr 是否改变。
    其次既然是全局的, var 就可以省略了。
    最后所有语句都执行完成后,在浏览器控制台再次运行 [console.log(listArr);]
        15
    will0404   2016-07-25 09:07:41 +08:00 via iPhone
    为什么一定要附到全局上呢 看你的需求不需要这么做啊 你只是不懂异步 要搞清楚 js 中蛋疼的流程控制
        16
    miaotaizi   2016-07-25 09:49:49 +08:00
    用回调函数解决.
        17
    xcodebuild   2016-07-25 10:00:43 +08:00
    。。。随便找本小书看看。。编程不是靠猜的。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3736 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 07:06 · PVG 15:06 · LAX 00:06 · JFK 03:06
    ♥ Do have faith in what you're doing.