Javascript 在函数内部调用函数-故障:函数未执行

Javascript 在函数内部调用函数-故障:函数未执行,javascript,function,scope,Javascript,Function,Scope,嗯。我想先道歉,因为我甚至不知道如何恰当地命名这个问题。 我会尝试解释: 我有一个这样的工作代码,但它有点混乱,所以我试图将它划分为小函数。 整个过程是一个模拟的滚动条: -div id=“scrollbar”表示滚动条轨迹。 -div id=“scrollbar”的唯一子级表示滚动条拇指 现在。每当document.documentElement中发生“onmousedown”事件时,就会执行函数checkAndPerform(e)。 checkAndPerform(e)获取滚动条的边框并调用

嗯。我想先道歉,因为我甚至不知道如何恰当地命名这个问题。 我会尝试解释: 我有一个这样的工作代码,但它有点混乱,所以我试图将它划分为小函数。 整个过程是一个模拟的滚动条:

-div id=“scrollbar”表示滚动条轨迹。
-div id=“scrollbar”的唯一子级表示滚动条拇指

现在。每当document.documentElement中发生“onmousedown”事件时,就会执行函数checkAndPerform(e)。 checkAndPerform(e)获取滚动条的边框并调用以下函数:

-checkClick(e):它检查是否在滚动条中发生了单击,并返回true或false

-perform():如果checkClick的结果为true,它会将拇指移动到单击位置。此外,它还会向下滚动滚动条操作的部分(section id=“ejercicios”)。最后,它向document.documentElement添加了一个“mousemove”EventListener,并附加了followMe(e)函数。 此followMe函数调用一个函数,该函数将滚动限制为轨迹栏边框。之后,它在“mousemove”处于活动状态时执行div的转换和节的滚动,最后调用一个函数release(),该函数添加一个“mouseup”EventListener,以在释放鼠标按钮后删除followMe函数

代码的想法是在这里得到的:

,您可以在接受的答案中看到名为“trackPoints”的函数被称为无麻烦函数(正如我之前的代码中所述)

因此,这里是令人不安的javascript代码:

function getHeight(object) {
    var height = object.getBoundingClientRect().bottom - object.getBoundingClientRect().top;
    return height;
}

function checkClick(e) {
    console.log("x:" + e.pageX, "y:" + e.pageY);
    if (e.pageX > sBLeft - 5 && e.pageX < sBRight + 5 && e.pageY < sBBottom && e.pageY > sBTop) {
        adentroBar = true;
        console.log("meas adentro");
    } else {
        adentroBar = false;
        console.log("meas afuera");
    }
    return adentroBar;
}

function scrollLimited(e) {
    if (e.pageY < sBTop) {
        translateY = 0;
    } else if (e.pageY > sBBottom) {
        translateY = getHeight(scrollBar) - getHeight(thumb);
    } else {
        translateY = e.pageY - sBTop - .5 * getHeight(thumb);
    }
}

function followMe(e) {
    scrollLimited;
    thumb.style.transform = "translate3d(0," + translateY + "px,0)";
    document.getElementById('ejercicios').scrollTop = translateY * ratio;
    document.documentElement.addEventListener("mouseup", release, false);
}

function perform() {
    if (adentroBar === true) {
        translateY = e.pageY - sBTop - getHeight(thumb) / 2;
    }
    thumb.style.transform = "translate3d(0," + translateY + "px,0)";
    document.getElementById('ejercicios').scrollTop = translateY * ratio;
    document.documentElement.addEventListener("mousemove", followMe, false);
}

function release() {
    document.documentElement.removeEventListener("mousemove", followMe, false);
}

function checkAndPerform(e) {
    var translateY, adentroBar, scrollBar = document.getElementById('scrollbar'),
        thumb = scrollBar.getElementsByTagName("div")[0],
        sBLeft = scrollBar.getBoundingClientRect().left,
        sBRight = scrollBar.getBoundingClientRect().right,
        sBTop = scrollBar.getBoundingClientRect().top,
        sBBottom = scrollBar.getBoundingClientRect().bottom,
        preg = document.getElementById('preguntas'),
        ratio = preg.offsetHeight / (getHeight(scrollBar) - getHeight(thumb));
    if (e.which === 1) {
        checkClick;
        perform;
    }
}
document.documentElement.addEventListener("mousedown", checkAndPerform, false);
函数getHeight(对象){
var height=object.getBoundingClientRect().bottom-object.getBoundingClientRect().top;
返回高度;
}
功能检查单击(e){
console.log(“x:+e.pageX,y:+e.pageY”);
如果(e.pageX>sBLeft-5&&e.pageXsBTop){
adentroBar=真;
控制台日志(“meas adentro”);
}否则{
adentroBar=假;
控制台日志(“meas afuera”);
}
返回adentroBar;
}
功能有限(e){
如果(如pageYsBBottom){
translateY=getHeight(滚动条)-getHeight(拇指);
}否则{
translateY=e.pageY-sBTop-.5*getHeight(拇指);
}
}
函数followMe(e){
滚动有限公司;
thumb.style.transform=“translate3d(0,+translateY+”px,0)”;
document.getElementById('ejercicios')。scrollTop=translateY*比率;
document.documentElement.addEventListener(“mouseup”,release,false);
}
函数执行(){
if(adentroBar===true){
translateY=e.pageY-sBTop-getHeight(thumb)/2;
}
thumb.style.transform=“translate3d(0,+translateY+”px,0)”;
document.getElementById('ejercicios')。scrollTop=translateY*比率;
document.documentElement.addEventListener(“mousemove”,followMe,false);
}
函数释放(){
document.documentElement.removeEventListener(“mousemove”,followMe,false);
}
功能检查和执行(e){
var translateY,adentroBar,scrollBar=document.getElementById('scrollBar'),
thumb=scrollBar.getElementsByTagName(“div”)[0],
sBLeft=scrollBar.getBoundingClientRect().left,
sBRight=scrollBar.getBoundingClientRect().right,
sBTop=scrollBar.getBoundingClientRect().top,
sBBottom=scrollBar.getBoundingClientRect().bottom,
preg=document.getElementById('preguntas'),
比率=preg.offsetHeight/(getHeight(滚动条)-getHeight(拇指));
如果(e.which==1){
单击复选框;
表演
}
}
document.documentElement.addEventListener(“mousedown”,check和perform,false);
此外,这里还有一把小提琴: 我可能会提供工作代码,以防您觉得它有趣,但正如我所说的,它确实杂乱无章,而且写得很烂。 问题是流中的第二个函数(checkClick)甚至没有被调用。 我尝试将其称为(checkClick(e)),在这种情况下,它会运行,但无法识别上面在checkAndPerform中定义的变量。 在我的工作代码中,一切都是一个唯一的函数,所以我认为这可能是一个范围问题,但我愿意接受任何想法。
为我的英语道歉,并提前表示感谢

如果您有一个名为
myFunction
的函数,您可以简单地将其作为
myFunction
传递,但要真正调用它,您必须将其编写为
myFunction()
。因此:

function checkAndPerform(e){
  var translateY, adentroBar, scrollBar=document.getElementById('scrollbar'), thumb=scrollBar.getElementsByTagName("div")[0], sBLeft=scrollBar.getBoundingClientRect().left, sBRight=scrollBar.getBoundingClientRect().right, sBTop=scrollBar.getBoundingClientRect().top, sBBottom=scrollBar.getBoundingClientRect().bottom, preg=document.getElementById('preguntas'), ratio=preg.offsetHeight/(getHeight(scrollBar)-getHeight(thumb));    

  if (e.which===1){
    checkClick;
    perform;
  }
}
应该是这样的:

function checkAndPerform(e){
  var translateY, adentroBar, scrollBar=document.getElementById('scrollbar'), thumb=scrollBar.getElementsByTagName("div")[0], sBLeft=scrollBar.getBoundingClientRect().left, sBRight=scrollBar.getBoundingClientRect().right, sBTop=scrollBar.getBoundingClientRect().top, sBBottom=scrollBar.getBoundingClientRect().bottom, preg=document.getElementById('preguntas'), ratio=preg.offsetHeight/(getHeight(scrollBar)-getHeight(thumb));    

  if (e.which===1){
    checkClick(e);
    perform(e); // make sure to pass e and expect it in perform, otherwise it won't have access to it
  }
}

在没有看到相应的标记的情况下,在我看来,这是代码中最有可能和最突出的问题。祝你好运

在此之后,我必须学习“pass”和“call”之间的区别,但正如您所说,它在将参数传递给每个函数之后才起作用。。除了一个…:对于这一个,我创建了一个具有属性的对象,现在它工作得很好!非常感谢!