Maison  >  Article  >  interface Web  >  Comment résoudre le problème d'une fonction non définie lorsque la fonction parent JS appelle la fonction enfant

Comment résoudre le problème d'une fonction non définie lorsque la fonction parent JS appelle la fonction enfant

一个新手
一个新手original
2017-09-25 10:50:313005parcourir

Tout d'abord, une fonction globale Locating est définie, et une fonction locale pageScroll est définie dans Locating. Ensuite, lorsque ma fonction globale appelle pageScroll, l'erreur Uncaught ReferenceError : pageScroll n'est pas défini est signalée.

Le code est le suivant :

function Locating(locate,time){
        console.log(locate+' -- '+time);
        var p_locate=document.getElementById(locate);
        var window_top_y = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离
        var element_top_y = p_locate.offsetTop;//获取某元素顶部距离页面顶部的距离
        var distance =   window_top_y-element_top_y;//当前窗口与顶部的距离
        var time = time;
var move_distance = time>50?Math.ceil((distance/Math.ceil(time/50))):distance;//每次移动的距离
        //每次移动的位移应为distance/duration,要移动的位置为element_top_y,
          function pageScroll() {
            var top = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离
            var dis_top = top - element_top_y;
                window.scrollBy(0,-move_distance);
                scrolldelay=setTimeout('pageScroll()',50);
                if(dis_top<=0){
                    clearTimeout(scrolldelay);
                }
//              console.log(dis_top);
            }
         pageScroll();
    }

Au début je le pensais était une question de chaîne de portée.

Mais le code avec la même structure ci-dessous n'exécute pas d'erreurs

 function a(){
        console.log("a")
        function b() {
                console.log("b")
            }
        b()
}

Aller à le forum et demandez à Down. Il s'avère que la raison de l'appel du mécanisme de fonction setTimeout

steTimeout est d'utiliser eval pour exécuter la chaîne 'action()' du premier paramètre puisque la chaîne action() le fait. n'existe pas, Ensuite, je l'ai changé en action d'objet pour tester,

Il s'avère qu'après l'exécution de setTimeout, l'environnement d'exécution passe automatiquement à l'environnement de fenêtre , donc pageScroll est appelé à nouveau () provoquera une erreur de fonction non définie. La solution est d'écrire

comme

setTimeout(&#39;pageScroll()&#39;,50)
. 🎜>

signifie écrire la chaîne en tant qu'objet

Il semble que lorsque setIntraval est exécuté, l'environnement sera également basculé vers l'objet window 🎜><.>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn