在窗口滚动上运行一次内部函数

时间:2014-07-19 13:41:15

标签: javascript jquery

我有一个在滚动窗口时运行的函数,它有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'函数的每次调用都需要有自己的'flags',每次使用全局变量都会非常混乱,因为这样做很多次 - 是否有可能在'whileScrolling'功能?

2 个答案:

答案 0 :(得分:0)

我认为使用全局变量没有更好的方法,因为每次调用函数时都会重新声明函数内部变量。但我建议使用对象简单地处理事情:

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

}  

答案 1 :(得分:0)

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

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);