1

完全な関数を渡すことができる関数があります。null でない場合は complete を呼び出したくないので、呼び出します

function queryJS(sql, success, error, complete) { 
...
...
if (complete !== null) complete()
...
...

次のような3つのパラメータで関数を呼び出すと:

queryJS("SELECT BLAH FROM TABLE", mysuccess, myerror) 

私は得る:

TypeError: complete is not a function

私の何が間違っていますか?

そして、完全な関数が渡されない場合をカバーする最良の方法は何ですか?

ありがとう

4

8 に答える 8

5

空の引数は常にundefined. したがってcomplete、関数かどうかを確認する必要があります。

if (typeof complete === "function") {
  complete();
}

無効な値に対してエラーをスローするには、または引数の配列の長さをcomplete確認できます。undefined

if (typeof complete !== "undefined") {
  complete();
}

if (arguments.length >= 4) {
  complete();
}
于 2013-05-15T13:21:05.263 に答える
3

nullではなく未定義になるため

if (complete !== undefined) complete()

ステートメントの上にある単純なデバッグ ステートメントで、それが示されます。

console.log(complete);
于 2013-05-15T13:22:39.860 に答える
2

これに対処する正しい方法completeは、 が関数かどうかを確認することです。

if (typeof complete == 'function') {
    complete();
}

また、引数を試す関数を作成します。

// executes argument f if it's a function
// @return the return value of f
function tryFunction (f) {
    if (typeof f == 'function') {
        return f.call();
    }
    return undefined;
}

これにより、テストがはるかに簡単になります。

function queryJS(sql, success, error, complete) {
    tryFunction(success);
    tryFunction(error);
    tryFunction(complete);
}
于 2013-05-15T13:21:44.830 に答える
1

Nicholas C. Zakas による「Maintainable JavaScript」から:

通常、変数を null のみと比較しても、続行しても安全かどうかを判断するのに十分な情報は得られません。typeof を使用することは、フレーム間でも機能するため、関数を検出するための最良の方法です。唯一の制限は、IE8 以前では、DOM の一部であるすべての関数 (document.getElementById など) が「関数」ではなく「オブジェクト」を返すことです。

したがって、typeof complete === "function"パラメータを使用する必要があります:

function queryJS(sql, success, error, complete) {
...
...
if (typeof complete === "function") complete()
...
...

注: クライアント側からサーバー側に SQL コマンドを送信することは、セキュリティが非常に低い方法です。SQL インジェクションは毎日行われます。

それが役に立てば幸い :)

于 2013-05-15T13:29:42.443 に答える
1

あなたの場合

if(complete) complete();

で十分です。こちらhttp://jsfiddle.net/XLbVH/

于 2013-05-15T13:25:55.210 に答える
0

JS 関数にパラメーターを渡さないと、null内部の値が取得されません。そのundefined代わりです。また、代わりに正論理を使用してください。このような:

if (typeof complete == "function") complete();

編集:ジャンティモンが彼の答えに書いたように、タイプをチェックすることは良い習慣です。

于 2013-05-15T13:21:17.540 に答える
0

関数にパラメーターを渡さない場合complete、関数内はcompleteになりますundefined。したがって、関数を実行する前にそれをテストできます-

if (typeof(complete) !== 'undefined' ) complete();

于 2013-05-15T13:21:44.870 に答える