JS 怎么将 function 中的局部变量输出到全局变量 - V2EX
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 9457 次点击
    这是一个创建于 3442 天前的主题,其中的信息可能已经有所发展或是发生改变。
    //具体代码:
    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     Solana     5185 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 09:13 PVG 17:13 LAX 01:13 JFK 04:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86