1

社内で開発された Javascript ライブラリを使用している一部のソフトウェアのバグを調査しています。私が扱っているエラーは、以下の行に表示されます。

GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + '~' + (bFinal == true ? '1' : '0');

最初はこの行が有効かどうかわかりませんでしたが、ソース管理によると、エラーが比較的最近のときにこのファイルが作成されたため、この行が存在していました。デバッグしたところ、この行でエラーがスローされることがわかりましたGetVal1(...) is not a function。関数定義を含む Javascript ファイルが含まれていることを再確認しました。ヘッダーは次のようになります。

function GetVal1(strHTMLId)

だから、私の質問は、この行は有効な Javascript コードですか? エラーをスローしている可能性があると言えるものはありますか? ありがとうございました。

4

1 に答える 1

2
GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + ...

次のことを行います。

  • GetVal1引数で呼び出します"dispLetter"
  • GetVal1再び引数で呼び出します"dispLetter"
  • selectedIndexの 2 回目の呼び出しの戻り値のプロパティを取得しますGetVal1
  • の最初の呼び出しの戻り値を、1GetVal1つの引数で の値で呼び出しますselectedIndex。これはあなたのケースに失敗し、値が呼び出し可能ではないと不平を言います。
  • 戻り値のvalueプロパティは逆参照されます。文字列の連結が続きます。

言い換えれば、このコードは、 の最初の呼び出しがGetVal1("dispLetter")関数を返し (異常です)、2 番目の呼び出しがプロパティを持つオブジェクトを返すことを想定しているようです (最初の呼び出しが関数を返すことを考えると、selectedIndexこれは異常です)。

いくつかのアイデア:

  • new行の前にキーワードがあった場合。次に、最初の呼び出しはコンストラクター呼び出しになります。ただし、コンストラクター呼び出しでは関数が返されるのに、非コンストラクター呼び出しでは関数が返されないことは予想外です。

  • 前の行に末尾のピリオドがあった場合GetVal1(または現在) は、何らかのオブジェクトのプロパティを参照します (または現在参照しています)。GetVal1ただし、がオブジェクト プロパティであることを意図している場合は、命名規則に違反しているようなにおいがします。

  • グローバルGetVal1は、同じ名前の関数によってシャドウされています (または最近停止されました)。またもや、命名規則違反の匂いがします。

  • ほとんどの場合、GetVal1それ自体が変更されました。この文字列を最初の引数として指定すると、 VerifyGetVal1は関数を返すことができます。

  • 関数にバインドされた状態GetVal1が変更された可能性があります (たとえば、コードの前のどこかでもう 1 つ余分な呼び出しが行われました。ただし、この関数が同じ引数を使用して呼び出しごとに異なるタイプのオブジェクトを返す場合、これは設計エラーである可能性が最も高くなります。しかし、もう一度、コードのどこかに設計エラーまたは命名違反がある可能性があります。

  • もう 1 つのもっともらしい説明は、この線は最初から存在していたが、これまで到達したことがなかったというものです。この場合、ずっと間違っていた可能性があります。

于 2013-03-15T16:36:59.990 に答える