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

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

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

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