Javascript参数未定义,即使它正在被传递

Javascript参数未定义,即使它正在被传递,javascript,callback,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.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") {
…这是在提取我的函数以在这里发布时丢失的。我同意这是我的错,我现在感觉很傻


而且我还意识到我的问题在哪里,在上面的一行中,不是检查函数是否存在,而是检查它是否实际正在执行,而且由于不满足条件,实际的代码行
窗口[回调](22)刚刚被跳过,因此标题“参数”没有被传递。

您的具体问题是,您传递的参数是字符串,并且您有一个函数检查它是否是函数,而它不是,因此您没有输入
if


然而 这不是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);

如果需要动态传递函数名(或者更确切地说,传递函数所引用的
窗口
上的属性名),可以通过以下方式基于上述代码进行构建:

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

但这有点代码味道。一般来说,依赖全局函数的可用性不是一种好的做法。

您的具体问题是,您传递的参数是一个字符串,并且您有一个函数检查它是否是函数,而不是,因此您没有输入
if


然而 这不是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);

如果需要动态传递函数名(或者更确切地说,传递函数所引用的
窗口
上的属性名),可以通过以下方式基于上述代码进行构建:

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

但这有点代码味道。一般来说,依赖全局函数的可用性不是一种好的做法。

代码中有几个问题:

  • 您必须像调用
    window.initFloof(window.callbacky)一样调用
    window.initFloof
    且不在单引号中传递值
  • 此调用应在将函数分配给
    window
    之后进行,即
    window.callbacky
    。在这里声明函数后,您就可以将其作为
    window.initFloof
  • 在函数
    窗口内。initFloof
    回调
    指函数
    窗口。callbacky
    因此您只需执行
    回调(22)
  • window.initFloof=函数(回调){
    设val1=22;//样本值
    如果(回调!==null){
    if(回调类型==“函数”){
    回调(22);
    }
    }
    }
    //这项声明是第一次
    window.callbacky=函数(val1){
    控制台日志(val1);
    };
    //这是第二个电话
    
    initFloof(window.callbacky)您的代码中有几个问题:

  • 您必须像调用
    window.initFloof(window.callbacky)一样调用
    window.initFloof
    且不在单引号中传递值
  • 此调用应在将函数分配给
    window
    之后进行,即
    window.callbacky
    。在这里声明函数后,您就可以将其作为
    window.initFloof
  • 在函数
    窗口内。initFloof
    回调
    指函数
    窗口。callbacky
    因此您只需执行
    回调(22)
  • window.initFloof=函数(回调){
    设val1=22;//样本值
    如果(回调!==null){
    if(回调类型==“函数”){
    回调(22);
    }
    }
    }
    //这项声明是第一次
    window.callbacky=函数(val1){
    控制台日志(val1);
    };
    //这是第二个电话
    
    initFloof(window.callbacky)
    ('callbacky')
    是字符串类型。尝试
    window.initFloof(callbacky)让我快速制作一个演示。还要注意,在<代码>窗口<代码>上释放变量/函数是一个非常糟糕的惯例,除非必要,否则应该避免使用。您当前的代码可以正常工作,但此检查:
    如果(typeof callback==“function”)
    正在破坏它。您正在检查传递值的类型。您应该检查:
    if(typeof window[callback]=“function”)
    为什么要“动态生成函数”…?您有一组预定义函数并选择一个(在这种情况下,使用字典/对象将字符串标识符转换为函数),或者您有一个定义的名称,其内容会发生更改(例如,传递回调函数)。函数和它们的名称都是动态的,这很不寻常。这简直是疯了。
    ('callbacky')
    是string类型的。尝试
    window.initFloof(callbacky)让我快速制作一个演示。还要注意,在<代码>窗口<代码>上释放变量/函数是一个非常糟糕的惯例,除非必要,否则应该避免使用。您当前的代码可以正常工作,但此检查:
    如果(typeof callback==“function”)
    正在破坏它。您正在检查传递值的类型。您应该检查:
    if(typeof window[callback]=“function”)
    为什么要“动态生成函数”…?您有一组预定义函数并选择一个(在这种情况下,使用字典/对象将字符串标识符转换为函数),或者您有一个定义的名称,其内容会发生更改(例如,传递回调函数)。函数和它们的名字都是d,这很不寻常