Uncaught ReferenceError: messageChecking is not defined

328
07 июля 2017, 07:48

Добрый день и сразу извинюсь, если вдруг продублировал вопрос, однако ответа совсем не нашел. Сразу суть проблемы:

<script>
            $(document).ready(function(){ 
                $('#create1').click(function(){ 
                    $.ajax({ 
                        url: "create1.php", 
                        cache: false, 
                        success: function(html){ 
                            $("#mainContent").html(html); 
                        } 
                    }); 
                }); 
                $('#create2').click(function(){ 
                    $.ajax({ 
                        url: "create2.php", 
                        cache: false, 
                        success: function(html){ 
                            $("#mainContent").html(html); 
                        } 
                    }); 
                }); 
                $('#tasks').click(function(){ 
                    $.ajax({ 
                        url: "tasks.php", 
                        cache: false, 
                        success: function(html){ 
                            $("#mainContent").html(html); 
                        } 
                    }); 
                }); 
                $('#msg').click(function(){ 
                    $.ajax({ 
                        url: "msg.php", 
                        cache: false, 
                        success: function(html){ 
                            $("#mainContent").html(html); 
                        } 
                    }); 
                }); 
                function messageChecking() {
                    $.ajax({
                        url: '/msgcheck.php',
                        type: 'POST',
                        success: function(response) {
                            alert('Script is running!');
                            result = jQuery.parseJSON(response);
                            if(result.countmsg != <?php echo $cc; ?>)
                            {
                                document.getElementById("countmsg").innerHTML = "Cообщения ("+result.countmsg+")";
                                var audio = new Audio(); 
                                audio.src = 'notify.mp3'; 
                                audio.autoplay = true;
                            }
                            Timer()
                        }
                    })
                }
                function Timer() {
                    setTimeout('messageChecking()', 1000);
                }
                Timer();
            });

проблема: Uncaught ReferenceError: messageChecking is not defined at anonymous:1:1

Все остальное, кроме функции таймера, которую вычитал здесь работает, но эту функцию своими руками вставить не смог. Как разобраться?

Answer 1

Замените

setTimeout('messageChecking()', 1000);

на

setTimeout(function() {
    messageChecking();
}, 1000);

Если передавать имя функции строкой - то интерпретатор js будет искать эту функцию в глобальной области видимости, вот пример:

function bar(a) {
    alert("глобально "+a)
}
function foo() {
    function bar(a) {
        alert("внутри foo "+a)
    }
    function timer1() {
        setTimeout(function() {
            bar('вызвано из timer1')
        }, 1000)
    }
     function timer2() {
        setTimeout("bar('вызвано из timer2')", 1000)
    }
    timer1()
    timer2()
}
foo()

Смотрите, при вызове setTimeout("bar('вызвано из timer2')" - внутренняя функция bar не находится, находится только глобальная, однако при вызове из функции - внутренняя bar будет найдена.

Потеря контекста происходит из за того, что при использовании строки с вызовом ф-и у нас создается новый объект Function и в его конструктор передается эта строка. Scope этого объекта по умолчанию - window, соответственно внутренняя ф-я не видна.

Почему не стоит использовать

setTimeout(messageChecking, 1000);

Если вы захотите передать аргументы внутрь функции вам придется указать их как аргументы для setTimeout:

setTimeout(messageChecking, 1000, arg1, arg2);

Для того что бы обработать такой код javascript внутри себя будет использовать медленную ф-ю apply, как итог - потеря производительности.

Answer 2
setTimeout('messageChecking()', 1000);
setTimeout(messageChecking, 1000);
READ ALSO
Вопрос о валидации полей

Вопрос о валидации полей

ЗдравствуйтеА каковы требования к таким полям как логин, e-mail и т

245
php oop начало движка

php oop начало движка

Привет друзья я начинающий в сфере php и хочу писать свой движок на php oop так вот для начала не могу найти материал верене не могу сформировать...

315
Как настроить MongoDB для работы с PHP?

Как настроить MongoDB для работы с PHP?

ПриветУстановил MongoDB на сервер с Ubuntu 16

276
Обновление токена

Обновление токена

Кто сталкивался, с подобной ситуацией?

233