dapengzhao
V2EX  ›  问与答

请教一个 js 问题

  •  
  •   dapengzhao · Aug 19, 2020 · 3955 views
    This topic created in 2266 days ago, the information mentioned may be changed or developed.
    $(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) # 没有反应
    
    Supplement 1  ·  Aug 19, 2020

    这里确实是异步的问题

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

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

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

    function nextStep( count ) { ... }

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

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

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