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

请教一个 js 问题

  •  
  •   dapengzhao 2020-08-19 09:30:38 +08:00 3223 次点击
    这是一个创建于 1929 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $(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  
    PRO
       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 nbsp;
    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     Solana     1014 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:30 PVG 07:30 LAX 15:30 JFK 18:30
    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