功能设置为运行一次不运行

时间:2015-12-27 17:27:53

标签: javascript jquery function

节日快乐!我该如何运行此功能?我可以看到在鼠标滚轮上运行的console.log,但是设置为运行一次的函数不会运行。在开始时,我还确保正文包含所需的类。

var $body = $('body');
            //using index
            if(index == 2){
                $body.css({
                    overflow: 'hidden'
                });

                if($body.hasClass('fp-viewing-secondPage')) {
                        $('html').on('mousewheel', function (e) {
                            console.log('fucks');
                            var delta = e.originalEvent.wheelDelta;
                            if($body.hasClass('setAn1')){
                                var something = (function() {
                                    var secret = false;
                                    return function () {
                                        if(!secret){
                                            console.log('call me once please an1');
                                            secret = true;
                                        }
                                    };
                                });
                                something();
                            }
                            if($body.hasClass('setAn2')){
                                var something2 = (function() {
                                    var secret = false;
                                    return function () {
                                        if(!secret){
                                            console.log('call me once please an2');
                                            secret = true;
                                        }
                                    };
                                });
                                something2();
                            }
                        });
                }
            }

2 个答案:

答案 0 :(得分:3)

var something = (function() {
    var secret = false;
    return function () {
        if(!secret) {
            console.log('call me once please an1');
            secret = true;
        }
    };
})();

你有上面的块是IIFE。我相信它所做的是将以下函数分配给变量。

function () {
    if(!secret) {
        console.log('call me once please an1');
        secret = true;
    }

你必须在这里调用某事()。

                secret = true;
            }
        };
    })();
   something();
}

我将你的程序结构移植到jfiddle中。您的主要问题是您正在修改在函数定义创建的范围内定义的值。只要该函数当前正在执行,该值仅持续一旦您离开函数,该值将离开作用域。你需要做的是定义函数范围之外的变量,这样你就不会失去你在点击之间保持的状态。

这是一个极小的例子。一旦完成循环,您将看到秘密被设置,然后阻止函数再次评估if()条件。

<img src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png">

var secret = false;
$('img').on('click', function(e) {
  console.log('what is my secret outside?', secret);
  if (!secret) {
    console.log('what is my secret inside?', secret);
    secret = true;
  }
});

https://jsfiddle.net/wa819y2j/9/

答案 1 :(得分:0)

var something = (function() {
    var secret = false;
    return function () {
        if(!secret){
            console.log('call me once please an1');
            secret = true;
        }
    };
});
var something2 = (function() {
    var secret = false;
    return function () {
        if(!secret){
            console.log('call me once please an2');
            secret = true;
        }
    };
});

var $body = $('body');
            //using index
            if(index == 2){
                $body.css({
                    overflow: 'hidden'
                });

                if($body.hasClass('fp-viewing-secondPage')) {
                        $('html').on('mousewheel', function (e) {
                            console.log('fucks');
                            var delta = e.originalEvent.wheelDelta;
                            if($body.hasClass('setAn1')){
                                something();
                            }
                            if($body.hasClass('setAn2')){
                                something2();
                            }
                        });
                }
            }

否则:

function runOnce(fun) {
    var secret = false;
    return function () {
        if(!secret){
            fun();
            secret = true;
        }
    };
}

var something = runOnce(function() {
    console.log('call me once please an1');
});
var something2 = runOnce(function() {
    console.log('call me once please an2');
});