2015-12-27 1 views
0

Happy Holidays! Как запустить эту функцию? Я вижу, что 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(); 
          } 
         }); 
       } 
      } 
+3

ли вы когда-нибудь вызвать функцию? – SLaks

+0

Определяется ли '$ body'? – guest271314

+0

От первой функции (той, которая присваивается чему-то) вы возвращаете другую функцию, которая никогда не выполняется. Если вы хотите выполнить обе функции, добавьте еще один символ '()' после тех, которые у вас уже есть, или просто вызовите 'something()' – Ibrahim

ответ

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/

+0

Я изменил его. и теперь функция называется, но ее не стреляют только один раз, но несколько раз. Как перенастроить код для одноразового использования? –

+1

@RickiMoore каждый раз, когда вы выполняете задание, вы также вызываете внешнюю функцию и создаете новый контекст и новую секретную переменную. Так что да, если вы выберете это сразу после назначения, это будет выполняться командой console.log. –

+0

Спасибо @MauricePerry, так как я могу структурировать это так, чтобы он вызывал один раз? Я потерял с этой стороны. –

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'); 
}); 
Смежные вопросы