先定義了一個全域函數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執行完成後,執行環境自動切換到window環境下,所以再次呼叫pageScroll ()時才會出現函數未定義的錯誤。
#
setTimeout('pageScroll()',50)即把字串寫成物件。 #
以上是如何解決js父級函數呼叫子函數出現函數未定義問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!