console.log(a) 里面有status这个值,为什么console.log(a.status)是undefined?

console.log(a); 里面有status这个值,为什么console.log(a.status)是undefined呢;
里面的这些值、方法要如何访问?
clipboard.png


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>
    <script src="https://cdn.bootcss.com/vue/2.5.3/vue.js"></script>

</head>
<body>
<div id="app">
    {{value}}
</div>
<script type="text/javascript">
     new Vue({
        el:"#app",
        data:{},
        computed:{
            value:function(){
                var url="https://easy-mock.com/mock/5a61abf341d8910ea886ec50/searchLists";
                var a= $.get(url,{},function(result){
                     return result;
                })
                console.log(a);   //打印出来变量a中有status这个值,为什么a.status是undefined,要如何访问里面a中里面的数据呢
                console.log(a.status);
                return a.status;
            }
        }
     })
</script>
</body>
</html>
阅读 4.1k
5 个回答

这样是可以的:

                a.done(() => {
                    console.log(a.status);//200
                    console.log(a);//a.readystate===4;
                });

这个原因就很明显了,你直接访问的话,浏览器还未或正在发送 xhr 请求,请求还没有完成,自然是访问不到 a.status 的,要访问需要在请求完成后访问才行,jq 的 ajax.done(fn) 就是在请求完成且成功时才去执行 fn 的这个时候才能访问到数据;

如果是原生js就是要监听 onreadystatechange 事件,当 readystate 由 1到4时,请求才完成,这个时候才能访问到 a.status,虽然这个时间很短,但是你直接在请求的代码后面访问肯定是不行的,jq 的 .done 然后就相当于在请求完成后且成功时才调用里面的回调,原理是一样的;

你看截图:
最初直接访问 a ,readystate 为 1;

clipboard.png

请求成功后访问 a ,readystate 为 4;

clipboard.png

的确是因为异步造成的。你执行console.log()方法的时候,ajax还没有成功返回.所以是undefined,至于为什么你控制台展开能看到status为200,其实很简单。chrome控制台显示的a是一个指针,当你展开时,它才取访问它的值。而当你点击展开时,ajax早已经成功返回了。
你看,当你打印时,状态还是1,
clipboard.png
当你点击展开后,状态为4,说明AJAX已执行成功

clipboard.png

新手上路,请多包涵

大概是因为a是通过ajax异步获取的

新手上路,请多包涵

好像是因为异步取值, console.log的时候数据还不存在, 你试试 if(a.status !=== undefined) { console.log(a.status) }可不可以

推荐问题
宣传栏