Javascript 覆盖没有函数传递给另一个函数的情况
我有一个函数,可以传递一个完整的函数。 如果complete不是null,我不想调用它,所以我会这样做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
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
作为一个预期为函数的参数传递,我宁愿它抛出一个错误,而不是默默地忽略它。是的,但我认为我们已经超出了问题的范围。不过,我确实同意,