首頁  >  問答  >  主體

javascript - 為什麼js裡面的return false無法阻止向下執行

 //再次验证手机号码 格式是否正确
            var reg = /^1[3|5|4|8|7|][0-9]\d{8}$/;
            var r = phone.match(reg);
            if (r == null) {
                layer.open({
                    content: '手机号码格式不正确'
                    ,skin: 'msg'
                    ,time: 3 //2秒后自动关闭
                });
                return false;   //第一个return false是有效的
            }

            //再次验证手机号码是否已经存在
            $.post("__MODULE__/Login/ajaxCheckPhoneIsExist",{phone:phone},function(data,status){


                if(data=="手机号码已被注册"){

                    layer.open({
                        content: '该手机号码已经存在'
                        ,skin: 'msg'
                        ,time: 3 //2秒后自动关闭
                    });

                    return false;   //第2个return false无效
                }

            });
            
            
            alert("11111");

//第一個return false是有效的
//第2個return false無效
請問是什麼原因

欧阳克欧阳克2686 天前3897

全部回覆(5)我來回復

  • 世界只因有你

    世界只因有你2017-06-12 09:23:55

    題主的第一個return false是同步調用的,因此能看見效果;

    $.post方法是異步執行的,因此在$.post方法的回調函數裡面return false的時候,其實是生效了的,但是在執行這句代碼的時候,$.post 外面的程式碼早就執行完成了,所以看不到效果而已。另外,在回呼函數裡面加上這句程式碼並沒有什麼意義,因為即使是return,也是退出目前執行的函數,即$.post的回調函數,並不能阻止$.post外面程式碼的執行。

    如果有程式碼需要在$.post請求成功之後執行的,那就把程式碼放到$.post方法的回呼函數裡面去吧。例如題主如果本意想讓alert('1111')在請求成功後透過條件判斷執行,那可以alert('11111')放在$.post方法的回呼函數中;

    這裡再跟題主解釋一下同步和非同步吧,舉個栗子,例如題主在寫程式碼,覺得口渴了,就去燒水喝。這個過程中題主就相當於一個線程,寫程式碼是題主目前正在執行的事情,覺得口渴了就去接點水放在那裡燒,不用管它,題主依然繼續寫程式碼,只需要等到水燒好了自己拿下來喝就好了。題主的程式碼也是一樣的,js從上到下執行,當執行到$.post就發送一個請求,請求的過程中外部的js還是繼續執行(並沒有等待$.post請求返回結果),等到ajax請求返回了,再回調之前定義的回呼函數。這裡除了$.post是非同步執行外,其餘的程式碼都是同步執行的。

    另外發現題主的正則可以優化,個人認為可以寫成/^1[34578]d{9}$/g

    回覆
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:23:55

    return返回的是當前函數的,你的第一個return相對的是一個click事件的回調函數,而第二個是相對的ajax請求的回調函數,自然不會阻止外層的函數回調

    回覆
    0
  • 学习ing

    学习ing2017-06-12 09:23:55

    post中函數是非同步函數,只有在請求成功後才會被調用,在請求成功返回前,會繼續向下執行程式碼。所以return false語句無效。解決方法是把return false 放在非同步函數外面,不要放在$.post()的非同步函數中。

    回覆
    0
  • 某草草

    某草草2017-06-12 09:23:55

    $.post 是非同步執行的,需要使用 $.ajax 並設定 async: false

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-12 09:23:55

    放在alert(1111)同級

    回覆
    0
  • 取消回覆