Наткнулся на Истинные ложные утверждения в функции javascript, в чем смысл? - PullRequest
0 голосов
/ 01 июня 2019

Я отрывал некоторый код от sharepoint и заметил, что в их функциях есть случайные истинные ложные утверждения. Моей первой мыслью было, что они остановят выполнение следующего оператора, но когда я сделал простой тест, журнал консоли показал, что он работает независимо от того, что.

Может ли кто-нибудь дать мне знать, для чего это нужно, в чем смысл и почему вы это сделаете.

вот пример, с которым я столкнулся и опубликую свой тест.

 function _SubmitFormPost(a, d, c) {
    if (typeof MSOWebPartPageFormName != "undefined") {

        var b = document.forms[MSOWebPartPageFormName];

        if (null != b)
        {
            if (d != undefined && d == true || typeof b.onsubmit == "undefined" || b.onsubmit == null || b.onsubmit() != false) {
                //HERE IS A RANDOM EXAMPLE OF T/F 
                typeof window.WebForm_OnSubmit == "function" && window.WebForm_OnSubmit();
                if (ajaxNavigate.get_search().match(new RegExp("[?&]IsDlg=1")) != null)
                a += a.indexOf("?") == -1 ? "?IsDlg=1" : "&IsDlg=1";
                if (FV4UI())
                try {
                    var e = SP.Ribbon.PageManager.get_instance().get_ribbon().get_selectedTabId();
                    if (Boolean(e)) {
                        a = StURLSetVar2(a, "InitialTabId", escapeProperly(e));
                        a = StURLSetVar2(a, "VisibilityContext", "WSSTabPersistence")
                    }
                } catch (f) {}
                if (c != undefined && c == true) {
                    a = DemoteIntoFormBody(b, a, "owsfileref");
                    a = DemoteIntoFormBody(b, a, "NextUsing")
                }
                b.action = STSPageUrlValidation(a);
                b.method = "POST";
                if (isPortalTemplatePage(a))
                b.target = "_top";
                !bValidSearchTerm && _ClearSearchTerm("");
                b.submit()
            }
        }
    }
}

и вот мой тест, окно консоли поражало все логи console.logs, которые я думал, что не будет

function s(){
    console.log('in s')
    //is true
    if(1==1){
        //is true
        if(2==2){
            console.log(' if 2==2 and eval of t/f is ',typeof(1) =="function")
            //is false -- expexted to skip console.log
            typeof(1) =="function"
            console.log('2 is 2')
        }
        //is true
        2==3
        if(3==3){
            console.log('3==3')
        }
    }
}
s()

1 Ответ

0 голосов
/ 01 июня 2019

&& не просто возвращает значение.Он также имеет эффект (управление потоком): его второй операнд оценивается только в том случае, если его первый операнд имеет значение true.То есть A && B не запускается B, если A уже false.(Это известно как оценка короткого замыкания .)

Другими словами,

typeof window.WebForm_OnSubmit == "function" && window.WebForm_OnSubmit();

ведет себя как

if (typeof window.WebForm_OnSubmit == "function")
    window.WebForm_OnSubmit();

, но слегкакороче.

Дело не в том, чтобы вернуть true или false (результат игнорируется);смысл в том, чтобы вызывать window.WebForm_OnSubmit только в том случае, если он определен как функция.

Аналогично,

!bValidSearchTerm && _ClearSearchTerm("");

работает следующим образом:

if (!bValidSearchTerm)
    _ClearSearchTerm("");
...