首頁 >web前端 >js教程 >如何解決js父級函數呼叫子函數出現函數未定義問題

如何解決js父級函數呼叫子函數出現函數未定義問題

一个新手
一个新手原創
2017-09-25 10:50:313050瀏覽

先定義了一個全域函數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(&#39;pageScroll()&#39;,50)
即把字串寫成物件。 #

以上是如何解決js父級函數呼叫子函數出現函數未定義問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn