>  기사  >  웹 프론트엔드  >  JS 부모 함수가 자식 함수를 호출할 때 정의되지 않은 함수 문제를 해결하는 방법

JS 부모 함수가 자식 함수를 호출할 때 정의되지 않은 함수 문제를 해결하는 방법

一个新手
一个新手원래의
2017-09-25 10:50:312937검색

먼저 Locating 전역 함수를 정의한 다음 Locating 내에서 로컬 함수 pageScroll을 정의합니다. 그런 다음 전역 함수가 pageScroll을 호출하면 Uncaught ReferenceError: pageScroll is not Defined 오류가 보고됩니다.

코드는 다음과 같습니다.

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();
    }

처음에는 스코프 체인 문제인 줄 알았어요.

근데 아래 같은 구조의 코드는 실행오류가 없습니다

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

포럼에 가서 물어보세요. 알고 보니 setTimeout

steTimeout 함수 메커니즘을 호출한 이유는 eval을 사용하여 첫 번째 매개변수인 'action()' 문자열을 실행하기 위한 것이었습니다. action() 문자열이 존재하지 않기 때문에 객체로 대체했습니다. action 테스트 해본 결과

setTimeout이 실행된 후 실행 환경이 자동으로 윈도우 환경으로 전환되어 pageScroll()을 다시 호출하면 정의되지 않은 함수 오류가 발생하는 것으로 나타났습니다.

해결책.

setTimeout(&#39;pageScroll()&#39;,50)

setTimeout(pageScroll,50);

로 쓴다는 것, 즉 문자열을 객체로 쓴다는 것입니다.

setIntraval이 실행되면 환경이 window 객체로 전환되는 것 같습니다. .

위 내용은 JS 부모 함수가 자식 함수를 호출할 때 정의되지 않은 함수 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.