まず、グローバル関数 Locating を定義し、次に Locating 内でローカル関数 pageScroll を定義します。次に、グローバル関数が pageScroll を呼び出すと、「Uncaught ReferenceError: pageScroll is not generated」というエラーが報告されます。
コードは次のとおりです:
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()文字列は存在しないため、オブジェクトに置き換えました。動作テストの結果、
setTimeout実行後、実行環境が自動的にウィンドウ環境に切り替わるため、再度pageScroll()を呼び出すと未定義関数エラーが発生することが分かりました
解決策。
setTimeout('pageScroll()',50)
を
setTimeout(pageScroll,50);
と書くと、setIntraval を実行すると環境も window オブジェクトに切り替わるようです。
以上がJSの親関数が子関数を呼び出す際に関数が未定義になる問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。