2b0x 2017-09-24 09:07 采纳率: 66.7%
浏览 2082

js内父级函数调用子函数出现函数未定义问题

首先定义了一个全局函数Locating,又在Locating内定义了一个局部函数pageScroll,然后我全局函数调用pageScroll时,报错Uncaught ReferenceError: pageScroll is not defined。

 function Locating(locate,time){
        console.log(locate+' -- '+time);
        var div_locate=document.getElementById(locate);
        var window_top_y = document.body.scrollTop;//获取滚动条顶部距离页面顶部的距离
        var element_top_y = div_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();
    }

请问除了将pageScroll定义为全局的函数,各位前辈还有哪些其他解决方法可以借鉴学习一下的

  • 写回答

5条回答 默认 最新

  • 花开鸟儿来 2017-09-24 11:09
    关注

    结构一样,没有报错

     function a(){
            console.log("a")
            function b() {
                    console.log("b")
                }
            b()
    }
    
    评论
  • 面向对象的夜猫子 2017-09-24 14:01
    关注

    原型模式可以试试啊。

    评论
  • schmalltsrenia 2017-09-24 15:27
    关注

    你应该把在全局调用pageScroll的部分也贴出来看看。就你这个函数而言,里面的setTimeout是可以访问pagescroll的。你想在Locating函数外访问它的局部函数pageScroll,定义成全局pageScroll是可以的,但是这样随便给全局加变量不太好,既然你已经把Locating定义为全局函数,不妨把Locating作为对象,把pageScroll写到Locating.prototype里面,这样便于以后的修改也便于重复调用。

    评论
  • jdshenyang 2017-09-25 01:18
    关注

    查看一下setTimeout调用规范:
    setTimeout(code, milliseconds, param1, param2, ...)
    setTimeout(function, milliseconds, param1, param2, ...)

    scrolldelay=setTimeout(pageScroll,50);
    这样试一式

    评论
  • white_g 2017-09-25 08:14
    关注

    先说解决办法吧 和楼上一样 setTimeout(pageScroll,50) 这样能解决的原因就是闭包

    再说说为什么你那样不行,你直接用setTimeout('pageScroll()',50) 这段代码的意思就是50秒之后执行pageScroll这个函数。但是你得知道垃圾回收这个机制
    当你函数Locating执行完毕之后,Locating这个函数的局部变量,凡事没有在被引用的就会被垃圾回收机制回收,就是注销掉。
    你的延时定时器是50ms之后再全局作用域下执行的,当50ms之后,pageScroll这个函数就已经被注销了,所以调用失败。

    从全局作用域不能调用局部作用域来解释也可以,因为pageScroll函数就是局部作用域,至于证明setTimeout是什么作用域,console一下this你就能明白一点,至少setTimeout是window对象的方法,在window对象上面是访问不到你的pageScroll这个函数的

    所以从上面两点都是不能访问的,来源的话,可以看看javascript作用域链规则以及垃圾回收机制
    至于为什么用setTimeout(pageScroll,50) 可以执行,因为pageScroll就是对函数作用域pageScroll函数的引用。闭包原理让他得不到释放,自然就能调用了

    评论

报告相同问题?

悬赏问题

  • ¥15 为什么我的虚拟机运行配置apache的脚本都会错误,重装也没用
  • ¥15 霍利韦尔软件web station N4的安装密码忘记了能找回吗
  • ¥20 帮电子新生画个仿真图吧🥰
  • ¥20 基于STM32F407设计一个贪食蛇游戏,要求:1有开始 、结束界面,能进行游戏设置,如:界面颜色,蛇移动速度。2蛇体能上下左右移动且在界面能随机生成食物,蛇吃后会变长;3小蛇碰壁死亡,显示游戏结束。
  • ¥15 摁摁钮(接P3.4口)无法实现点阵管播放速度调节,大家能帮我看看是什么问题吗?TAT
  • ¥30 小型网络防火墙mstp.vrrp.ospf配置
  • ¥15 grafna发送告警信息
  • ¥15 51单片机,LCD屏幕内容修改
  • ¥20 Ida Pro动态调试
  • ¥15 TensorFlow深度学习拓展项目