我有一个可以传递完整功能的功能。 如果它不是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
我做错了什么?
覆盖没有通过完整功能的情况的最佳方法是什么。
由于
答案 0 :(得分:5)
空参数始终为undefined
。
所以你应该检查complete
是否是一个函数:
if (typeof complete === "function") {
complete();
}
要为无效的complete
值引发错误,您可以检查undefined
或。{
对于参数数组长度:
if (typeof complete !== "undefined") {
complete();
}
if (arguments.length >= 4) {
complete();
}
答案 1 :(得分:3)
因为它是未定义的,不是null
if (complete !== undefined) complete()
语句上方的简单调试语句会向您显示。
console.log(complete);
答案 2 :(得分: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);
}
答案 3 :(得分:1)
答案 4 :(得分:1)
来自Nicholas C. Zakas的“可维护的JavaScript”:
仅将变量与null进行比较通常不会给您 有关该值的足够信息,以确定它是否安全 继续。使用typeof是检测函数的最佳方法,因为它 也适用于各种框架。唯一的限制是IE8及更早版本 任何属于DOM的函数(例如document.getElementById) 返回“对象”而不是“功能”
所以你应该使用typeof complete === "function"
参数:
function queryJS(sql, success, error, complete) {
...
...
if (typeof complete === "function") complete()
...
...
注意:从客户端向服务器端发送SQL commans是一种非常低安全性的做法。您每天都会进行SQL注射。
希望有所帮助:)
答案 5 :(得分:0)
如果未将参数传递给JS函数,则不会在其中获取null
值。它是undefined
。另外,请使用正逻辑。像这样:
if (typeof complete == "function") complete();
编辑,因为jantimon把它放在他的答案中,检查一个类型是一个很好的做法。
答案 6 :(得分:0)
如果未将complete
参数传递给函数,则函数complete
中的undefined
将为if (typeof(complete) !== 'undefined' ) complete();
。所以你可以在运行函数之前测试它 -
{{1}}
答案 7 :(得分:-1)
更改功能的设计,更好的是您使用对象。像这样。
function jqueryJS(jsobj) {
if (jsobj.complete) {
jsobj.complete();
}
}
jqueryJS({complete: function() { console.log('asfasdf');}})