最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

检查一个函数是否在nodejs中的另一个函数内

IT培训 admin 11浏览 0评论

检查一个函数是否在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中的另一个函数内

提出以下情况:

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
发布评论

评论列表 (0)

  1. 暂无评论