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» как функцию, так где же ошибка?

Консоль Сафари:

функция? function 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 возвращает общую ошибку undefined. IMO Safari должен вернуть соответствующее сообщение об ошибке, связанное с аргументом, который не может быть оценен в этом контексте. - person Gustavo; 21.07.2014