14

次のスクリプトを検討してください。

if (false)​ {
    function foo() {
        alert("FOO");
    }
}
foo(); // alerts "FOO"

ご覧のとおり、関数fooは定義されており、 の条件がif失敗しても機能します。

これを行う理由は、InDesign の拡張機能を開発していて、他のスクリプトで使用されるさまざまな機能を保持する utility.jsx というスクリプトを作成したためです。これらの関数を必要とするすべてのスクリプトで、私は単純に次を使用します。

app.doScript(File(scriptsFile.parent.fsName + "/t_utilities.jsx"), ScriptLanguage.JAVASCRIPT);

これにより、必要なすべての関数が定義され、それらを使用できるようになります。さて、このスクリプトはさまざまなファイルによって予測不可能な順序 (ユーザーが決定) で複数回呼び出されるため、以前に関数が定義されていない場合 (utilities.jsx がまだ実行されていない場合) にのみ関数を定義できると考えました。 . require_oncephpのようなものです。

次のようなことを考えていましたが、スクリプトが実行されるたびに関数が定義されるため、機能しません:`

var utilitiesHasRun;
if (utilitiesHasRun !== true) {
  // define all the functions
  // ...
  utilitiesHasRun = true;
}

他のオプションはありますか?

4

4 に答える 4

20

関数宣言の代わりに関数にすることができます:

if (false)​ {
    var foo = function () {
        alert("FOO");
    };
}
foo(); //TypeError: undefined is not a function

上記のコードでfooは、条件が false と評価されても、 にアクセスできることに注意してください。これは、関数スコープの宣言( function と の両方var) が宣言されているスコープの先頭に引き上げられるためです。ただし、代入はコード内の出現箇所で行われます。

上記のコードが効果的に行っていることは次のとおりです。

var foo; //No assignment, foo is undefined
if (false)​ {
    foo = function () {
        alert("FOO");
    };
}
foo(); //TypeError: undefined is not a function

警告- 名前付き関数の式は、Internet Explorer 8 以下でも巻き上げられます (これは IE のバグです)。明らかに、これは古いブラウザをサポートする必要がある場合にのみ潜在的な問題です。

于 2012-06-14T14:17:14.767 に答える
8

関数が以前に定義されていないことを確認するには、次を使用します。

if ( typeof yourFunctionName == 'undefined' ) {
  yourFunctionName = function( params ) {
    // your code here
  };
}
于 2012-06-14T14:18:38.513 に答える
3

関数ポインターを使用して、必要に応じて関数を再割り当てできます。

var myFunctionPointer = function { alert("Default"); };
if (condition) {
    myFunctionPointer = function { alert("true"); };
}
else {
    myFunctionPointer = function { alert("false"); };
}
myFunctionPointer();
于 2012-06-14T14:17:45.453 に答える
0

通常、最終的にマイナー JS 関数を呼び出すメソッドを含むオブジェクトを返す関数に基づいて、完全な API を作成します。拡張機能は、組み込みクラスを使用して JS ファイルと対話できます。クックブックへのリンクを提供したと思います。したがって、AS3 でオブジェクトを宣言し、次のようなプロパティを確認することができます。

public var jsAPI:Object = {};

jsコードは次のようになります

var jsAPI = function() {
    return {
        hasBeenLoaded:false,
        myMethod1:function(){},
    }
}

次に、AS3 で JS 関数を使用する必要がある場合は、次のようなフラグを確認できます。

if ( jsAPI.hasBeenLoaded ){ … }
else { //loads the API via new API() }
于 2012-06-14T22:16:00.373 に答える