所以我有这个功能
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);
只是被跳过,因此标题,参数没有被传递。
答案 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)
您的代码中存在几个问题:
window.initFloof
那样调用window.initFloof(window.callbacky);
,而不必在单引号中传递值。window
的{{1}}之后执行此调用。在此声明函数后,您就可以将其作为window.callbacky
window.initFloof
中,window.initFloof
引用了函数callback
,因此您只需要执行window.callbacky
。
callback(22);