V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dapengzhao
V2EX  ›  问与答

请教一个 js 问题

  •  
  •   dapengzhao · 2020-08-19 09:30:38 +08:00 · 2876 次点击
    这是一个创建于 1582 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $(document).ready(function () {
                $.ajax({
                    url: "{% url 'func' %}?x={{ x }}&y={{ y }}",
                    success: function (response) {
                        if (response.count >= 0) {
                            z = response.count;
                            alert(z) # 可以弹框
                            
                        }
                    }
                });
            alert(z) # 没有反应
    
    第 1 条附言  ·  2020-08-19 10:36:12 +08:00

    这里确实是异步的问题

    <script>
    $(document).ready(function () {
                $.ajax({
                    async: false,
                    url: "{% url 'func' %}?x={{ x }}&y={{ y }}",
                    success: function (response) {
                        if (response.count >= 0) {
                            z = response.count;
                            alert(z) # 可以弹框
                            
                        }
                    }
                });
            alert(z) # 可以弹框
               });
    </script>
    我现在的问题是怎么在下面这个使用z
    <script>
    alert(z)
    </script>
    

    我不是js,也不是php程序员,就是有个前端需求需要我来写一下。

    大家没必要因为语音不同起争执,以和为贵。

    35 条回复    2020-08-20 09:34:29 +08:00
    toma77
        1
    toma77  
       2020-08-19 09:34:42 +08:00
    Uncaught ReferenceError: z is not defined
    kop1989
        2
    kop1989  
       2020-08-19 09:36:07 +08:00
    js 当你给某个变量赋值时,如果这个变量没声明过,会进行声明。
    但是你最下面的 alert(z),这个 z 还未进行过任何声明 /赋值。必然是抛异常的。
    masker
        3
    masker  
       2020-08-19 09:37:42 +08:00 via Android
    多扎实基础吧。 作用域
    TomVista
        4
    TomVista  
       2020-08-19 09:39:02 +08:00
    alert(z) 时$.ajax 还没运行
    Yumwey
        5
    Yumwey  
       2020-08-19 09:39:14 +08:00
    执行上下文中,z 尚未声明,ajax 异步了。
    sevenzhou1218
        6
    sevenzhou1218  
       2020-08-19 09:49:42 +08:00   ❤️ 2
    php 程序员经常干这事....
    AngryPanda
        7
    AngryPanda  
       2020-08-19 09:58:07 +08:00
    @sevenzhou1218 我都懒得骂你
    masker
        8
    masker  
       2020-08-19 10:03:30 +08:00 via Android   ❤️ 1
    @sevenzhou1218 蠢比?
    flowfire
        9
    flowfire  
       2020-08-19 10:14:38 +08:00   ❤️ 1
    @TomVista
    @Yumwey
    跟异步没关系,js 里新声明的变量作用域是函数级,出了函数就访问不到( let 是块级,出了大括号就访问不到)
    即使这里是个 IIFE 也会报错
    flowfire
        10
    flowfire  
       2020-08-19 10:15:28 +08:00   ❤️ 1
    @flowfire 补充一下 ,let const 都是块级作用域。
    sevenzhou1218
        11
    sevenzhou1218  
       2020-08-19 10:22:56 +08:00
    @AngryPanda
    @masker
    早上没刷牙吗? 还是戳到你的痛点了? 我遇到的 php 程序员本来就经常干这事。
    toma77
        12
    toma77  
       2020-08-19 10:23:59 +08:00
    @flowfire 这里就是异步的问题,z = response.count 这种不加 var/const/let 声明的是全局变量
    AngryPanda
        13
    AngryPanda  
       2020-08-19 10:26:00 +08:00   ❤️ 1
    @sevenzhou1218

    我来告诉你原因 —— 因为你只能和这样水平的人在一起工作。
    qiayue
        14
    qiayue  
       2020-08-19 10:28:27 +08:00   ❤️ 2
    @sevenzhou1218 你遇到的 PHP 程序员都干这事,你的反思反思,为什么会与这样的 PHP 程序员为伍 3
    flowfire
        15
    flowfire  
       2020-08-19 10:31:20 +08:00
    @toma77 我的错。。。。。严格模式习惯了。。。不带 var let const 会报错
    Biwood
        16
    Biwood  
       2020-08-19 10:35:19 +08:00
    https://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html

    阮一峰老师这篇博客很好的解释了 JavaScript 里面同步和异步的区别,建议认真看看。对于新手来说,这块确实不好理解,大家都是这么一步步走过来的。
    masker
        17
    masker  
       2020-08-19 10:38:40 +08:00 via Android
    @sevenzhou1218 都不是。 单纯觉得你的发言蠢。
    sevenzhou1218
        18
    sevenzhou1218  
       2020-08-19 10:38:59 +08:00
    @AngryPanda
    @qiayue
    确实啊,我自己就是 php 出身啊,我也从没说过自己牛逼啊。我只是说 php 程序员经常干这事而已。
    sevenzhou1218
        19
    sevenzhou1218  
       2020-08-19 10:39:49 +08:00
    @qiayue
    @AngryPanda
    @masker
    相互拉黑吧,不想跟你们扯了。
    AngryPanda
        20
    AngryPanda  
       2020-08-19 10:41:17 +08:00   ❤️ 1
    @sevenzhou1218 你这种人需要拉黑?我就喜欢看你上蹿下跳。
    Biwood
        21
    Biwood  
       2020-08-19 10:44:14 +08:00   ❤️ 1
    回楼主的 Append 的内容:你没法直接在下面使用 z,你需要把下面的逻辑封装成函数,比如

    function nextStep( count ) { ... }

    然后在 success 回调里面调用 nextStep 函数,把 z 当做参数传进去即可。
    dapengzhao
        22
    dapengzhao  
    OP
       2020-08-19 10:48:04 +08:00
    @Biwood 感谢,我试一下
    sixway
        23
    sixway  
       2020-08-19 10:58:41 +08:00
    使用未声明的变量,这样的做法并不好。

    局部变量,全局并不能访问。可以提升,或者使用闭包。或者使用楼上说的
    czkm1320
        24
    czkm1320  
       2020-08-19 11:12:43 +08:00
    就是异步问题,不信可以 setTimeout(()=>{console.log(z)},100) 试试
    azh7138m
        25
    azh7138m  
       2020-08-19 13:36:58 +08:00 via iPhone
    这和 js 有个鸡儿关系
    别的语言照样有这种异步的问题啊

    自己菜不要怪语言
    NasirQ
        26
    NasirQ  
       2020-08-19 14:03:23 +08:00
    归根结底,请求异步啊
    dapengzhao
        27
    dapengzhao  
    OP
       2020-08-19 14:21:42 +08:00
    @azh7138m 大佬,我也没说自己牛逼啊,这也确实是在 js 遇到的问题啊,我应该贴个 js 代码,说这个 java 问题怎么解决?还有我就是菜这我很坦然的承认,碍着大神眼了,我的锅,我的锅,大神出门左拐,慢走不送啊。。。。。。
    Yumwey
        28
    Yumwey  
       2020-08-19 15:37:20 +08:00
    @flowfire ... 这就是异步问题啊... 同步的话,函数内早被提升了。
    xingyuc
        29
    xingyuc  
       2020-08-19 15:50:52 +08:00
    你们说话就不能友好点么,戾气那么重
    nmdx
        30
    nmdx  
       2020-08-19 16:25:43 +08:00 via Android
    这可能是一个新手经常懵逼的地方。。想当年因为这个问题才弄懂了什么叫异步😄
    anerinck
        31
    anerinck  
       2020-08-19 16:25:53 +08:00
    @azh7138m 似乎楼主也没有怪语言吧。。。
    azcvcza
        32
    azcvcza  
       2020-08-19 16:35:21 +08:00
    不明白的地方都打上 log 呗
    netnr
        33
    netnr  
       2020-08-19 16:44:34 +08:00
    方式一:回调,把 ajax 请求封装成回调函数,后面的脚本写在回调函数里面,当然 ajax 返回的值可以做缓存
    方式二:Promise,同上,写法不一样,优雅一些
    sunwang
        34
    sunwang  
       2020-08-19 17:39:48 +08:00
    没有反应是因为你使用了一个没有定义的变量,js 报错不执行了。
    关于你想在下面使用使用,建议你写在函数里,在 success 成功回调里去传入 z 参数执行函数。
    TomVista
        35
    TomVista  
       2020-08-20 09:34:29 +08:00
    jq 的话,就无限套 callback
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4728 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:00 · PVG 18:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.