как обнаружить функцию была вызвана с помощью JavaScript - PullRequest
13 голосов
/ 26 июля 2010

У меня есть функция JavaScript.

Как проверить:

  • если функция была вызвана (в секции <head></head> есть эта функция), то не вызывать функцию

  • если функция не была вызвана (в секции <head></head> этой функции нет), то вызвать функцию

как require_once или include_once с PHP

Ответы [ 5 ]

27 голосов
/ 29 января 2011

Два варианта:

Статические переменные Ниже описано, как создавать статические (как в C) переменные, используя функции собственного вызова для хранения статических переменных в замыкании.

var myFun = (function() {
  var called = false;
  return function() {
    if (!called) {
      console.log("I've been called");
      called = true;
    }
  }
})()

Замена пустой функции Установить функцию на пустую функцию после ее запуска.

function callonce() {
  console.log("I've been called");
  arguments.callee = function() {};
}

Абстрактная идея Вот функция, которая возвращает функцию, которая тольковызывается один раз, поэтому нам не нужно беспокоиться о добавлении кода котельной пластины в каждую функцию.

function makeSingleCallFun(fun) {
  var called = false;
  return function() {
    if (!called) {
       called = true;
       return fun.apply(this, arguments);
    }
  }
}

// Alternate implementation   
function makeSingleCallFun(fun) {
    return function() {
      return fun.apply(this, arguments);
      arguments.callee = function() {};
    }
}

var myFun = makeSingleCallFun(function() {
  console.log("I've been called");
});
myFun(); // logs I've been called
myFun(); // Does nothing
11 голосов
/ 26 июля 2010

Использовать шаблон декоратора.

// your function definition
function yourFunction() {}

// decorator
function callItOnce(fn) {
    var called = false;
    return function() {
        if (!called) {
            called = true;
            return fn();
        }
        return;
    }
}

yourFunction(); // it runs
yourFunction(); // it runs    
yourFunction = callItOnce(yourFunction);
yourFunction(); // it runs
yourFunction(); // null

Это решение обеспечивает свободный от побочных эффектов способ достижения вашей цели.Вам не нужно изменять исходную функцию.Это хорошо работает даже с библиотечными функциями.Вы можете назначить новое имя украшенной функции, чтобы сохранить исходную функцию.

var myLibraryFunction = callItOnce(libraryFunction);
myLibraryFunction(); // it runs
myLibraryFunction(); // null
libraryFunction(); // it runs
3 голосов
/ 26 июля 2010

Вы можете использовать глобальную переменную в пользовательском пространстве имен, чтобы хранить, была ли вызвана функция.

if(!window.mynamespace){
    window.mynamespace={};
}

mynamespace.callMeOnlyOnce=function(){

    if(mynamespace.alreadyCalled)return;

    alert('calling for the first time');
    mynamespace.alreadyCalled=true;
};

// alert box comes
mynamespace.callMeOnlyOnce();


// no alert box
mynamespace.callMeOnlyOnce();
3 голосов
/ 26 июля 2010
var called = false;
function blah() {
   called = true;
}

if ( !called ) {
   blah();
}
0 голосов
/ 26 июля 2010
If (!your_func.called) {
    your_func.called = true;
    your_func();
}
...