您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页如何解决js父级函数调用子函数出现函数未定义问题

如何解决js父级函数调用子函数出现函数未定义问题

来源:叨叨游戏网


首先定义了一个全局函数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)

写成

setTimeout(pageScroll,50);

即把字符串写成对象。

好像setIntraval执行时是也会把环境切换到window对象下。

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务