函数是否在nodejs中的另一个函数内"/>
检查一个函数是否在nodejs中的另一个函数内
提出以下情况:
function functionExists(functionName) {
if (typeof window[functionName] == 'function') console.log("It's a function");
}
nodejs
中没有全局functionExists
变量的window
中的等效函数是什么?
混凝土状况:
我的具体情况使用webpack
而不是nodejs
,但是基本上问题是相同的。我可以在此处使用window
,但要清晰地实现所有内容将太复杂,webpack
建议不要将其减轻到window
全局变量中。
[基本上,我有一个PHP
后端,它生成一个HTML <form>
,它通过data
属性为其添加了一些选项。加载页面后,我的JavaScript会初始化此<form>
并为其提供一系列功能(例如,验证)。 javascript使用此表单的另一件事是,它解析它的data属性,而不是正常的页面重新加载提交,它更改了表单,以便通过ajax
请求将其提交给服务器。
发生此提交时,将设置按钮和整个表单被禁用,直到我的Ajax
脚本发回响应为止。这是如何完成的,就是我有一个Project_Form
类,该类在初始化后将自身附加到jQuery
提交事件,停止基本的提交事件,并运行将ajax请求发送到api的内部函数方法。设置了ajax请求,以便在收到响应时,相同的实例化类将收到此响应,因此我可以继续使用它。
[当表单收到响应时,它必须对其进行处理。在最基本的情况下,它必须向用户显示成功消息,但是在某些更复杂的情况下,例如,它必须进行页面重定向(例如登录表单)。现在,它已经设置为默认,它将显示一条消息,但是当我在PHP中定义此表单时,我可以选择“劫持”该默认行为,而不是将ajax响应发送给一个自定义函数,它将专门解决这种情况。
当我使用PHP呈现表单时,我已经知道表单应该在何处发送成功响应(针对哪个javascript函数),但是我只能通过字符串将此信息提供给javascript。因此,我的Project_Form
类应获取此字符串,并应尝试从中获取将使用的函数。这就是我的问题所在。
除非您明确知道这是一个全局函数(在nodejs中几乎从来没有这种情况),否则nodejs中的函数默认情况下将作用域限定在模块范围内,并且无法像使用浏览器中的window
对象,就像无法在Java函数中按名称查找局部变量一样。
通常,不要通过字符串名称传递函数。或者,如果需要,那么您需要创建一个查找表,您可以根据该表检查函数名称。
[我建议您在这里解释您要解决的实际问题,因为按字符串名称传递函数并不是您通常想做的事情。
[eval()
有一些破解方法,可以查看字符串是否表示范围内的函数名称:
// Warning, you must know that the argument f (if it is a string) does not
// contain harmful Javascript code because it will be used with eval()
function isFunction(f) {
// if already a function reference
if (typeof f === "function") {
return true;
// see if string represents a function name somewhere in scope
} else if (typeof f === "string") {
try {
return eval(`typeof ${f} === "function"`);
} catch(e) {
return false;
}
} else {
return false;
}
}
注:此测试检查该功能是否在isFunction()
功能的范围内。如果要测试它是否在当前范围内,则需要执行以下操作:
eval(`typeof ${f} === "function"`)
内联在您当前的作用域中,以便它在您要从中进行查找的作用域中运行。
为了考虑使用它,您将必须知道字符串的源是安全的,并且不能包含有害代码。但是,正如我之前说的,最好以不同的方式设计程序,以免使用字符串名称来引用函数。
并且,这是一个可运行的代码段,显示了它的运行情况(也可以在node.js模块中使用:]
function test() {
console.log("in test");
}
function isFunction(f) {
// if already a function reference
if (typeof f === "function") {
return true;
// see if string represents a function name somewhere in scope
} else if (typeof f === "string") {
try {
return eval(`typeof ${f} === "function"`);
} catch(e) {
return false;
}
} else {
return false;
}
}
console.log(isFunction("test")); // true
console.log(isFunction(test)); // true
console.log(isFunction("notAFunction")); // false
更多推荐
检查一个函数是否在nodejs中的另一个函数内
发布评论