Undefined не е грешка на функцията с дефиниран аргумент

Така че това е част от прост JavaScript код за обработка на xmlhttprequest. Частта, която генерира грешката, е най-отдолу (друго ако):

    httpReq.onreadystatechange = function(){
        if (httpReq.readyState == 4) {
            if (httpReq.status == 200) {
                var strRes = httpReq.responseText;
                if(xmlOrig) strRes = (new $Xml(strRes, true)).conteudo(xmlOrig);
                if(elemDest) $id(elemDest).innerHTML = strRes;
                if(func) {
                    var dadosArray = new Array(4, strRes, httpReq, 'OK', 'Concluído com sucesso.');
                    window[func](dadosArray);
                }
            } else {
                if(elemDest) elemDest.innerHTML = 'Erro: '+httpReq.status+' | '+httpReq.statusText;
                if(func) {
                    var dadosArray = new Array(4, false, httpReq, 'erro', 'Erro, conteúdo não carregado!');
                    window[func](dadosArray);
                }
            }
        } else if(func){
            console.log("func? "+typeof(func));
            var dadosArray = new Array(httpReq.readyState);
            window[func](dadosArray);  // <-- HERE IS THE ERROR!
        }
    }

Въпреки това, console.log връща аргумента "func" като функция, така че къде е грешката?

Конзолата на Safari:

функция функция TypeError: 'undefined' не е функция (оценява 'windowfunc')


person Gustavo    schedule 19.07.2014    source източник
comment
Къде дефинирате какво представлява променливата func? Не го предавате или дефинирате някъде?   -  person Gerrat    schedule 20.07.2014
comment
Дефинирах функция за тестване в корена. Първо, реших, че това е грешка във функцията, но функцията за тестване няма нищо общо (като тест). Мисля, че може да е грешка, че Safari не може да уточни къде.   -  person Gustavo    schedule 21.07.2014
comment
Намерих го: func трябва да е низ, така че не мога да дефинирам func = Function, но func = NameOfTheFunction.   -  person Gustavo    schedule 21.07.2014


Отговори (2)


Сигурни ли сте, че func е на прозореца? Проверявате за func, което може да е във всеки обхват и след това можете да извикате window.func().

person wesbos    schedule 19.07.2014
comment
Тъй като typeof(func) връща функция, предполагам, че функцията е правилно дефинирана и я дефинирах в корена. - person Gustavo; 21.07.2014
comment
Отговорът: func трябва да е низ, така че не мога да дефинирам func = Function, но func = NameOfTheFunction. - person Gustavo; 21.07.2014

Вероятно сте искали да направите window["func"] вместо window[func].

Последният израз е еквивалентен на window["function(someParam) { ... }"] (т.е. каквото и да е съдържанието на func в действителност). window вероятно няма свойство, чието име е цялото текстово съдържание на низове на func.

person apsillers    schedule 19.07.2014
comment
Функцията не се нарича func. Използвам func = doNothing като тест, а function = doNothing(d){ } е дефинирана в корена. - person Gustavo; 21.07.2014
comment
Намерих го. Докато идеята ви не е отговорът, тя ми дава друга идея: func трябва да е низ, така че не мога да дефинирам func = Function, а func = NameOfTheFunction. - person Gustavo; 21.07.2014
comment
@GustavoPinent Името на променливата, която съдържа функцията, се нарича func и вие идентифицирате тази променлива по име в синтаксиса на скобите чрез низа "func". За да обобщим двата случая: window["someString"] се отнася до глобалната променлива someString, докато window[someVar] се отнася до глобална променлива, чието име е съдържанието на someVar. Ако someVar е зададено на "foo", тогава window[someVar] се отнася за глобалното foo. - person apsillers; 21.07.2014
comment
Добре, но в този случай искам да насоча функция към получаване на отговорите, така че window[func] ще свърши работата (трябва да избера). Проблемът е, че ако func съществува, но няма низ с името на функцията, Safari връща обща недефинирана грешка. IMO Safari трябва да върне съответното съобщение за грешка, свързано с аргумент, който не може да бъде оценен в този контекст. - person Gustavo; 21.07.2014