Javascript 在窗口滚动上运行一次内部功能
我有一个在滚动窗口时运行的函数,它有3个回调,通过不同的函数调用多次,调用次数取决于滚动的数量: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 >
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时都会生成一个新函数。