1

我有一个可以传递完整函数的函数。如果它不为空,我不想调用完整,所以我这样做

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

因为它是未定义的,而不是空的

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

在你的情况下

if(complete) complete();

绰绰有余。这里http://jsfiddle.net/XLbVH/

于 2013-05-15T13:25:55.210 回答
1

来自 Nicholas C. Zakas 的“可维护的 JavaScript”:

仅将变量与 null 进行比较通常不会为您提供有关该值的足够信息来确定继续进行是否安全。使用 typeof 是检测函数的最佳方法,因为它也适用于跨帧。唯一的限制是,在 IE8 和更早版本中,任何属于 DOM 的函数(例如 document.getElementById)都返回“object”而不是“function”

所以你应该使用typeof complete === "function"参数:

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

注意:从客户端向服务器端发送 SQL commans 是一种极低安全性的做法。您每天都会收到 SQL 注入。

希望能帮助到你 :)

于 2013-05-15T13:29:42.443 回答
0

当您不将参数传递给 JS 函数时,它不会获取null内部的值。相反undefined。另外,请改用积极的逻辑。像这样:

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

编辑:正如 jantimon 在他的回答中所说,检查类型是一种很好的做法。

于 2013-05-15T13:21:17.540 回答
0

当您不将complete参数传递给函数时,函数内complete将是undefined. 因此,您可以在运行该功能之前对其进行测试 -

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

于 2013-05-15T13:21:44.870 回答
-1

更改功能的设计,最好是使用对象。像这样。

function jqueryJS(jsobj) {
   if (jsobj.complete) {
        jsobj.complete();

   }

}


jqueryJS({complete: function() { console.log('asfasdf');}})
于 2013-05-15T13:27:48.967 回答