web-dev-qa-db-ja.com

JavaScriptで呼び出された関数を検出する方法

私はJavaScript関数を持っています。

確認方法:

  • 関数が呼び出された場合(<head></head>セクションにこの関数があります)。次に、関数を呼び出さないようにします

  • 関数が呼び出されなかった場合(<head></head>セクションにこの関数は含まれていません)、関数を呼び出します

お気に入り require_onceまたはinclude_once with [〜#〜] php [〜#〜]

13
Chameron

静的変数

ここでは、自己呼び出し関数を使用して静的変数(Cなど)を作成し、静的変数をクロージャーに格納する方法を説明します。

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

アイデアを抽象化

1回だけ呼び出される関数を返す関数を次に示します。これにより、すべての関数にボイラープレートコードを追加する必要がなくなります。

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

var myFun = makeSingleCallFun(function() {
  console.log("I've been called");
});

myFun(); // logs I've been called
myFun(); // Does nothing
30
Juan Mendes

デコレータパターンを使用します。

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

カスタム名前空間のグローバル変数を使用して、関数が呼び出されたかどうかを保存できます。

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();
4
var called = false;
function blah() {
   called = true;
}

if ( !called ) {
   blah();
}
3
meder omuraliev
If (!your_func.called) {
    your_func.called = true;
    your_func();
}
0
Thevs