25

私がやりたいことから逃れるための良いテクニック、つまりグローバル変数を設定する方法を探しています。

誰かがボタンをクリックして関数を初めて実行すると、最初の関数がトリガーされ、いくつかのものをドラッグ可能に変換します。後でボタンをもう一度クリックした場合、init関数が初期化されているかどうかを判断し、初期化されている場合は再度呼び出さないようにします。init関数からグローバル変数を設定し、クリック関数からその変数をチェックすることでこれを簡単に行うことができますが、グローバル変数を設定せずにこれを行う方法を知りたいです。これを行う方法の例が本当に欲しいです。

4

6 に答える 6

29

関数にプロパティを追加できます。

function init() {
    init.called = true;
}

init();

if(init.called) {
    //stuff
}
于 2012-07-02T19:29:59.363 に答える
22

@Leviの答えはうまくいくはずですが、別のオプションを提示したいと思います。init 関数が呼び出されたら何もしないように上書きします。

var init = function () {
   // do the initializing

    init = function() {
        return false;
    }
};

初めて呼び出された関数は、init を実行します。その後、すぐに自分自身を上書きして、次に呼び出されたときに false を返します。関数が 2 回目に呼び出されると、関数本体には return false のみが含まれます。

詳細については、http ://www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/ を参照してください。

于 2012-07-02T19:37:27.503 に答える
2

ドラッグ可能なものにクラスがあるかどうかを確認してみませんdraggableか?

if ($('.mydiv').is('.draggable')) {
     //do something
}
于 2012-07-02T19:31:08.640 に答える
2
Function.prototype.fired = false;

function myfunc() { 
    myfunc.fired = true; 
    // your stuff
};

console.log(myfunc.fired) // false

myfunc();

console.log(myfunc.fired) // true
于 2014-04-04T02:19:46.437 に答える
1

あなたができることは、プロトタイプからinit関数のフックを外すことです。

​var Obj = function () {
    this.init = function () {
        document.write("init called<br/>");
        this.init = null;
    }
}
var o = new Obj();
if (o.init) document.write("exists!<br/>");
o.init();
if (o.init) document.write("exists!<br/>");
o.init();

1つ目ifはtrueで出力されますexists!が、関数がそれ自体を削除するため、2つ目ifは失敗します。私の例では、何も起こらないことを示すために2番目のinitを無条件に呼び出しますが、もちろん、存在する場合にのみ呼び出すことができます。

if (o.init) o.init();

http://jsfiddle.net/coreyog/Wd3Q2/

于 2012-07-02T19:55:49.183 に答える