Как определить функцию, вызванную с помощью javascript

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

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

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

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

как require_once или include_once с PHP

Ответ 1

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

Статические переменные Здесь, как создавать статические (как в 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

Ответ 2

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

// 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

var called = false;
function blah() {
   called = true;
}

if ( !called ) {
   blah();
}

Ответ 4

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

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

Ответ 5

If (!your_func.called) {
    your_func.called = true;
    your_func();
}