Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 覆盖没有函数传递给另一个函数的情况_Javascript - Fatal编程技术网

Javascript 覆盖没有函数传递给另一个函数的情况

Javascript 覆盖没有函数传递给另一个函数的情况,javascript,Javascript,我有一个函数,可以传递一个完整的函数。 如果complete不是null,我不想调用它,所以我会这样做 function queryJS(sql, success, error, complete) { ... ... if (complete !== null) complete() ... ... 当我使用3个参数调用函数时,例如: queryJS("SELECT BLAH FROM TABLE", mysuccess, myerror) 我得到: TypeError: comple

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

function queryJS(sql, success, error, complete) { 
...
...
if (complete !== null) complete()
...
...
当我使用3个参数调用函数时,例如:

queryJS("SELECT BLAH FROM TABLE", mysuccess, myerror) 
我得到:

TypeError: complete is not a function
我做错了什么

对于没有传递完整函数的情况,最好的解决方法是什么


谢谢

空参数总是
未定义的
。 因此,您应该检查
complete
是否是一个函数:

if (typeof complete === "function") {
  complete();
}
要为无效的
complete
值抛出错误,可以检查
未定义的
或
对于参数数组长度:

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

if (arguments.length >= 4) {
  complete();
}

空参数总是
未定义的
。 因此,您应该检查
complete
是否是一个函数:

if (typeof complete === "function") {
  complete();
}
要为无效的
complete
值抛出错误,可以检查
未定义的
或
对于参数数组长度:

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

if (arguments.length >= 4) {
  complete();
}

如果不将参数传递给JS函数,则不会在其中获取
null
值。它是未定义的
。同样,用积极的逻辑来代替。像这样:

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

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

当您不将参数传递给JS函数时,它不会在内部获得
null
值。它是未定义的
。同样,用积极的逻辑来代替。像这样:

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

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

正确的处理方法是检查
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);
}

正确的处理方法是检查
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);
}

如果未将
complete
参数传递给函数,函数中的
complete
将是
未定义的
。因此,您可以在运行函数之前测试-


if(typeof(complete)!=“undefined”)complete()

当您没有将
complete
参数传递给函数时,函数中的
complete
将是
未定义的
。因此,您可以在运行函数之前测试-


if(typeof(complete)!=“undefined”)complete()

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

if (complete !== undefined) complete()
该语句上方的一个简单调试语句将向您显示这一点

console.log(complete);

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

if (complete !== undefined) complete()
该语句上方的一个简单调试语句将向您显示这一点

console.log(complete);
就你而言

if(complete) complete();
这已经足够了。这是你的情况

if(complete) complete();

这已经足够了。此处

更改函数的设计,最好使用对象。像这样

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

   }

}


jqueryJS({complete: function() { console.log('asfasdf');}})

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

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

   }

}


jqueryJS({complete: function() { console.log('asfasdf');}})
来自Nicholas C.Zakas的“可维护JavaScript”:

通常情况下,将变量与空值进行比较不会给您 有关该值的足够信息,以确定 继续使用typeof是检测函数的最佳方法,因为它 也可以跨帧工作。唯一的限制是IE8和更早版本中的限制 作为DOM一部分的任何函数(如document.getElementById) 返回“对象”而不是“函数”

因此,您应该使用
typeof complete==“function”
参数:

function queryJS(sql, success, error, complete) {
...
...
if (typeof complete === "function") complete()
...
...
注意:从客户端向服务器端发送SQL命令的安全性极低。您每天都会得到SQL注入

希望它有帮助:)

来自尼古拉斯·C·扎卡斯的“可维护的JavaScript”:

通常情况下,将变量与空值进行比较不会给您 有关该值的足够信息,以确定 继续使用typeof是检测函数的最佳方法,因为它 也可以跨帧工作。唯一的限制是IE8和更早版本中的限制 作为DOM一部分的任何函数(如document.getElementById) 返回“对象”而不是“函数”

因此,您应该使用
typeof complete==“function”
参数:

function queryJS(sql, success, error, complete) {
...
...
if (typeof complete === "function") complete()
...
...
注意:从客户端向服务器端发送SQL命令的安全性极低。您每天都会得到SQL注入


希望有帮助:)

您在
if(complete!==null)complete()中将complete作为函数使用。
虽然它不是空的,但它是未定义的?e、 g.
typeof complete==“undefined”
如果您与
进行比较=
那么它就可以工作了,尽管您实际检查它是否存在以及函数是否是好的建议。您在
if(complete!==null)complete()
中使用complete作为函数,虽然它不是空的,但它不是空的,而是未定义的?e、 g.
typeof complete==“undefined”
如果您与
进行比较=
然后它就可以工作了,尽管您实际检查它是否存在和函数是否是好的建议。这是错误的:假设
complete
10
,这将导致一个错误。@MatteOtasinari这取决于具体情况。如果我不经意地将
10
作为一个预期为函数的参数传递,我宁愿它抛出一个错误,而不是默默地忽略它。是的,但我认为我们已经超出了问题的范围。不过,我确实同意,在这种情况下,类型检查通常是一种很好的做法。这是错误的:假设
complete
10
,这将导致错误。@MatteoTassinari,这取决于具体情况。如果我不经意地将
10
作为一个预期为函数的参数传递,我宁愿它抛出一个错误,而不是默默地忽略它。是的,但我认为我们已经超出了问题的范围。不过,我确实同意,