Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在窗口滚动上运行一次内部功能_Javascript_Jquery - Fatal编程技术网

Javascript 在窗口滚动上运行一次内部功能

Javascript 在窗口滚动上运行一次内部功能,javascript,jquery,Javascript,Jquery,我有一个在滚动窗口时运行的函数,它有3个回调,通过不同的函数调用多次,调用次数取决于滚动的数量: var acc = 0; function whileScrolling(callback1, callback2, callback3){ if(acc > 0 && acc < 100){ callback1(); } if(acc < 0){ callback2(); } if(acc >

我有一个在滚动窗口时运行的函数,它有3个回调,通过不同的函数调用多次,调用次数取决于滚动的数量:

var acc = 0;

function whileScrolling(callback1, callback2, callback3){

   if(acc > 0 && acc < 100){
      callback1();
   } 

   if(acc < 0){
      callback2();
   }

   if(acc > 100){
      callback3();
   }
}

$(window).scroll(function(){

    whileScrolling(func1, func2, func3);
    whileScrolling(func4, func5, func6);
    whileScrolling(func7, func8, func9);

    acc++;
});
Callback1根据需要进行处理,但是2和3只能运行一次,除非回调1再次运行,在这种情况下,它们可以再次运行。如果我只给它打一次电话,我就可以加入一些全局布尔值并像这样运行它:

var acc = 0;
var outcomeFlag = false;

function whileScrolling(callback1, callback2, callback3){

   if(acc > 0 && acc < 100){
      callback1();
      outcomeFlag = false;
   } 

   if(acc < 0 && outcomeFlag === false){
      callback2();
      outcomeFlag = true;
   }

   if(acc > 100 && outcomeFlag === false){
      callback3();
      outcomeFlag = true;
   }
}  

$(window).scroll(function(){
    whileScrolling(func1, func2, func3);
    acc++;
});

然而,“whileScrolling”函数的每次调用都需要有自己的一组“标志”,为每个调用使用全局标志将非常混乱,因为这将被多次执行-是否可能在“whileScrolling”函数中包含此行为

我认为没有比使用globals更好的方法了,因为每次调用函数时都会重新声明函数intern变量。但我建议使用对象简化事情:

var outcomeFlag = {};
function whileScrolling(callback1, callback2, callback3){
    ...
    if(acc > 100 && !outcomeFlag[callback2]) {
        do your stuff
        outcomeFlag[callback2] = true;
    }

}  

您可以创建一个返回函数的函数。内部函数可以引用外部函数的参数。我不知道如何更好地解释这一点,希望这段代码足够清晰:

function configureWhileScrolling(flag1, flag2, flag3) {

    var outcomeFlag = false;

    return function (callback1, callback2, callback3){

        if(acc > 0 && acc < 100){
            callback1();
            outcomeFlag = flag1;
        } 

        if(acc < 0 && outcomeFlag === false){
            callback2();
            outcomeFlag = flag2;
        }

        if(acc > 100 && outcomeFlag === false){
            callback3();
            outcomeFlag = flag3;
        }
    }  
}

whileScrollingInstance1 = configureWhileScrolling(false, true, true);

whileScrollingInstance1(callback1, callback2, callback3);

是的,这是有效的,如果每次都能绕开宣布“whilescorlingstance”那就太好了,旗帜将永远不会被设置为除假、真、真之外的任何东西,所以不需要通过这些,但多行一行也不是太大的交易。@yung hans你可以做配置whilescorlingfalse,真、真回调1、回调2、回调3;但这样,每次调用crolling时都会生成一个新函数。