먼저 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('pageScroll()',50)
를
setTimeout(pageScroll,50);
로 쓴다는 것, 즉 문자열을 객체로 쓴다는 것입니다.
setIntraval이 실행되면 환경이 window 객체로 전환되는 것 같습니다. .
위 내용은 JS 부모 함수가 자식 함수를 호출할 때 정의되지 않은 함수 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!