推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
cstome

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

  •  
  •   cstome · Jul 24, 2016 · 9661 views
    This topic created in 3578 days ago, the information mentioned may be changed or developed.
    //具体代码:
    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
    Supplement 1  ·  Jul 24, 2016
    问题确实出在 XHP 异步,那么问题改成“怎样把 XHR 获得的数据输出到全局变量?”。
    除了将 async:false 还有别的方法吗?
    17 replies    2016-07-25 10:00:43 +08:00
    morethansean
        1
    morethansean  
       Jul 24, 2016
    这哪是局部变量还是全局变量, xhr 是异步的你 send 之后代码又不会停住等你取结果。
    ljbha007
        2
    ljbha007  
       Jul 24, 2016
    楼主需要理解一下 js 中的异步操作是什么意思
    cstome
        3
    cstome  
    OP
       Jul 24, 2016
    @morethansean 嗯,那么要怎样实现我想要的功能,可以给个思路吗?
    eastpiger
        4
    eastpiger  
       Jul 24, 2016 via Android
    这个应该已经是全局了吧。然而重点在于异步的话, log 的时候并没有执行到赋值的地方呢
    learnshare
        5
    learnshare  
       Jul 24, 2016
    xhr 是基于事件来处理结果的,也就是 xhr 会在拿到结果之后,调用你绑定的事件监听函数。
    shiye515
        6
    shiye515  
       Jul 24, 2016
    @cstome getList.open("GET", "list.json", false);
    SoloCompany
        7
    SoloCompany  
       Jul 24, 2016
    xhr 可以用 async:false 但这是 deprecated 的功能用了是自寻死路,还是老老实实去学一下怎么用异步吧
    caomu
        8
    caomu  
       Jul 24, 2016 via Android
    function nextStep(result){console.log(result)}

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