11

私はActionscriptに少し慣れていませんが、これを理解することはできません。私はこのトピックについて多くの検索を行いましたが、明確な答えは見つかりませんでした。私は人々がオンラインで投稿した以下の解決策を試しましたが、どれもうまくいきません。

次のすべての解決策でエラーが発生します:1120:未定義のプロパティmyVariableへのアクセス

提案#1:

try {
     trace(myVariable); }
catch {
     trace("your variable doesn't exist"); }

提案#2:

if (myVariable) {
     trace("your variable exists!!"); }
else {
     trace("it doesn't exist"); }

提案#3:

if ( myVariable == null )
     trace("your variable doesn't exist");

提案#4:

if ( myVariable == undefined )
     trace("your variable doesn't exist");

私が言ったように、私はそれらがうまくいくと言って上記の提案を与える多くのフォーラムの投稿やものをオンラインで見つけました、しかしそれらはすべて私に同じ1120:未定義のプロパティmyVariableエラーへのアクセスを与えているようです。

ちなみに、なぜ変数が存在するかどうかを確認する必要があるのか​​疑問に思われる場合は、URLでSWFに変数を渡すことを計画しているので、適切な変数が存在することを確認してコードを処理する必要がありますそれらが渡されない場合は適切に。


早速のお返事ありがとうございます。まだ実際には機能していません。変数のスコープは、スクリプトのトップ/ルートレベルにあります。基本的に、新しいフラッシュファイルを開始し、最初のフレームで次のアクションを追加します。

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
     trace("myVariable exists");
}
else
{
     //Variable doesn't exist, so declare it now
     trace("declaring variable now...");
     var myVariable = "Default Value";
}

trace(myVariable);

フラッシュファイルを実行すると、次の出力が得られます。

myVariable exists
undefined

私はこれを期待していました:

declaring variable now...
Default Value
4

7 に答える 7

12

LiraNunaの答えは、ローダーパラメーターにアクセスするための正しい方法です。ただし、(後世のために)変数の存在を確認する方法の質問に答えるために、これはすべてのオブジェクトに存在するhasOwnProperty()メソッドを使用して行われます。

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
    trace("myVariable exists");
} else {
    //Variable doesn't exist, so declare it now
    trace("declaring variable now...");
    this.myVariable = "Default Value";
}

trace( this.myVariable );

それはあなたの状況をカバーするはずです。しかし、変数を直接参照するだけで、変数の存在を確認する方法がわかりません。私はあなたがその範囲を通してそれを参照しなければならないと信じています。

于 2009-09-27T05:17:04.250 に答える
5

ちなみに、なぜ変数が存在するかどうかを確認する必要があるのか​​疑問に思われる場合は、URLでSWFに変数を渡すことを計画しているので、適切な変数が存在することを確認してコードを処理する必要がありますそれらが渡されない場合は適切に。

次に、あなたは間違ったアプローチを取っています。SWFパラメータを読み取り、検証する正しい方法™と、存在しない場合のデフォルト値は次のとおりです。

private function parameter(name:String, defaultValue:String):String
{
        // Get parameter list
    var paramObj:Object = LoaderInfo(stage.loaderInfo).parameters;

        // Check if parameter exists
    if(paramObj.hasOwnProperty(name) && paramObj[name] != "")
        return paramObj[name];                     
    else
        return defaultValue;
}

警告!これは'stage'プロパティで中継されるため、このコードはDocumentClassまたはその後のいずれかから使用してくださいEvent.ADDED_TO_STAGE

于 2009-09-27T05:26:02.797 に答える
0

フェノームはおそらく最も正しいです。(おそらく、そのメソッドを使用するようにコードの一部を変更する必要があります)。しかし、私が現在クラスに使用しているメソッドは次のとおりです。

try {
  if(this["myFunction") {
    this["myFunction"]();
  }
catch(e:Error) {}

これは例外をスローするため、最もエレガントではありません。

この種のコードを使用する理由は、ボイラープレートコードを作成するために、少し動的コーディングを行い、flexの「インクルード」を悪用しているためです。

于 2009-09-27T05:36:59.967 に答える
0

trace(myVariable);

于 2010-09-07T04:19:34.660 に答える
0

ステージが利用できない場合は、root.loaderInfo.parametersからパラメーターを抽出してみてください。チェーンの各プロパティがnullであるかどうかを確認するように注意してください。

if( root != null && root.loaderInfo != null && root.loaderInfo.parameters != null ) {
     myVar = root.loaderInfo.parameters.myVar;
}
于 2011-02-11T23:34:35.620 に答える
0
    if (myVariable === "undefined") {
      trace("variable doesn't exist");
    else
      trace("variable exists");

三重比較演算子に注意してください。これは、Javascriptの時代から学んだちょっとしたトリックです。AS3でも機能し、nullの場合でも配列要素が存在するかどうかを確認するのに役立ちます。このような:

var array:Array = ["zero", 1, null];
if (array[2]) //returns false
if (array[2] !==  "undefined") //returns true
于 2011-05-25T16:13:27.063 に答える
0

私は最近同じ問題を抱えていました、そして私はこれを修正する方法を調べました。しかし、私はあなたがそのように変数を登録するとき...

var i:int;

...すでに作成されている場合、変数はリセットされません。たとえば、これがフレーム1の私のコードである場合。

var i:int;
if (i > 0){
    i++;
} else {
    i = 1;
}

次に、フラッシュが同じフレームに戻るたびに、これらは「i」の値になります。

// First Iteration
trace(i); // 1
// Second Iteration
trace(i); // 2
// Third
trace(i); // 3, etc...

それは私自身のプロジェクトで機能し、前の回答よりもはるかに少ないコードです。それがあなたにも役立つことを願っています。

于 2015-03-07T18:29:05.333 に答える