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,这很不寻常