即使传递了Javascript参数,也未定义

时间:2018-08-27 13:45:13

标签: javascript callback

所以我有这个功能

window.initFloof = function (callback) {
    ....
    let val1 = 22; // Sample value
    if (callback !== null) {
        if (typeof callback === "function") {
//          callback(val1); // Both are working but arguments don't get passed.
            window[callback](22); // Both are working but arguments don't get passed.
        }
    }
}

我正在按以下方式调用上述功能

window.initFloof('callbacky');

现在使用callbacky函数。

window.callbacky= function (val1) {
    console.log(val1); // This is giving Undefined, while I am expecting a `22` as per the above example. Alerts if set, are triggering btw which means the function is being executed.
};

编辑:-

好的,伙计,非常抱歉,我实际上是在使用

if (typeof window[callback]() === "function") {

...这在将我的函数精简为在此处发布时迷失了。我同意这是我的坏事,现在感觉很愚蠢。

我也意识到我的问题所在,在上一行,而不是检查函数是否存在,它实际上是在执行,并且由于不满足条件,因此是实际的代码行window[callback](22);只是被跳过,因此标题,参数没有被传递。

2 个答案:

答案 0 :(得分:4)

您的特定问题是,您要传递的参数是一个字符串,并且您有一个函数来检查它是否是一个函数,不是,因此您没有进入if块。 / p>


但是

这不是PHP。不能通过传递字符串并使它们在全局范围内可用来引用函数。

在JavaScript中,函数是普通对象,因此只需将函数本身直接作为回调传递。

window.initFloof = function (callback) {
    ....
    let val1 = 22; // Sample value
    // null check is redundant, null is of type "object".
    if (typeof callback === "function") {
        // No need for window[..., callback is a reference to a function.
        callback(22); // Call the callback object with the parameter.
    }
}

window.initFloof(window.callbacky);

如果您需要动态传递函数的名称(或者更确切地说,是引用window上属性的名称),则可以按照上述方式在上面的代码上进行构建:

function initFloofStringCallback(functionName) {
  return initFloof(window[functionName]);
}

但这有点代码味道。通常,依靠全局功能的可用性不是一个好习惯。

答案 1 :(得分:1)

您的代码中存在几个问题:

  1. 您必须像window.initFloof那样调用window.initFloof(window.callbacky);,而不必在单引号中传递值。
  2. 应在将功能分配给window的{​​{1}}之后执行此调用。在此声明函数后,您就可以将其作为window.callbacky
  3. 的参数进行传递
  4. 在函数window.initFloof中,window.initFloof引用了函数callback,因此您只需要执行window.callbacky

callback(22);