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

时间:2013-05-15 13:19:17

标签: javascript

我有一个可以传递完整功能的功能。 如果它不是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

我做错了什么?

覆盖没有通过完整功能的情况的最佳方法是什么。

由于

8 个答案:

答案 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)

在你的情况下

if(complete) complete();

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

答案 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');}})