首先定义了一个全局函数Locating,又在Locating内定义了一个局部函数pageScroll,然后我全局函数调用pageScroll时,报错Uncaught ReferenceError: pageScroll is not defined。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function Locating(locate,time){
console.log(locate+& #39; -- '+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;
function pageScroll() {
var top = document.body.scrollTop;
var dis_top = top - element_top_y;
window.scrollBy(0,-move_distance);
scrolldelay=setTimeout(& #39;pageScroll()',50);
if (dis_top<=0){
clearTimeout(scrolldelay);
}
}
pageScroll();
}
|
Salin selepas log masuk
一开始以为是作用域链的问题。
但如下相同结构的代码并没有执行错误
1 2 3 4 5 6 7 | function a(){
console.log( "a" )
function b() {
console.log( "b" )
}
b()
}
|
Salin selepas log masuk
去论坛问了下。原来是执行调用setTimeout的原因
steTimeout函数机制就是用eval执行第一个参数'action()"字符串,既然action()字符串不存在,那么我把它换成了一个对象action进行测试,
原来setTimeout执行完成后,执行环境自动切换到window环境下,所以再次调用pageScroll()时才会出现函数未定义的错误。
解决方法是将
1 | setTimeout(& #39;pageScroll()',50)
|
Salin selepas log masuk
写成
1 | setTimeout(pageScroll,50);
|
Salin selepas log masuk
即把字符串写成对象。
好像setIntraval执行时是也会把环境切换到window对象下。
Atas ialah kandungan terperinci 如何解决js父级函数调用子函数出现函数未定义问题 . Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!