Javascript在调用之前查找函数/类是不是存在

Posted

技术标签:

【中文标题】Javascript在调用之前查找函数/类是不是存在【英文标题】:Javascript Finding if Function/Class exists before calling itJavascript在调用之前查找函数/类是否存在 【发布时间】:2011-07-12 20:34:40 【问题描述】:

我知道如何检查全局上下文的属性是否存在。任何变化

if (typeof myFunction != 'undefined')...

但是如果我不知道函数的名称怎么办?我认为在全球范围内我可以做到这一点

if (typeof this['myFunction'] != 'undefined')...

但我不知道如何在这样的函数中做到这一点

function load(functionName)
  if (typeof GLOBALCONTEX[functionName] != 'undefined')
    GLOBALCONTEX[functionName](arg1 , arg2 , ...);
  

我不想使用 try/catch,因为我听说它很慢。

【问题讨论】:

【参考方案1】:

如果使用浏览器,请将GLOBALCONTEX 替换为window。示例:

function load(functionName)
  if (typeof window[functionName] != 'undefined')
   window[functionName](arg1 , arg2 , ...);
  

【讨论】:

问题是关于使用其名称作为字符串调用全局函数,这就是为什么它不如将函数作为对象调用“一样好”。 @katspaugh:这就是我删除它的原因。 ;) 我会接受这个作为答案,因为它是最好的回应。快速提问,通过浏览器查看的 javascript 浏览量有多少? 99%? 50%?更多,更少?【参考方案2】:

全局上下文是窗口。所有对象都附在它上面。

function load(functionName)
      if (typeof window[functionName] != 'undefined')
        window[functionName](arg1 , arg2 , ...);
      
    

【讨论】:

正如一些人指出的那样,情况并非总是如此(尽管可能是 99% 的情况)【参考方案3】:

在浏览器中,全局对象是window [docs]。如果您使用其他 JavaScript 执行环境(如 Node.js),请查看其文档以找出全局对象的名称/引用。

当然,这样的测试只适用于在全局范围内定义的函数,而不是在任何更高范围内。因此,可能是这样的函数可用(并且可访问)但它不在全局范围内。

【讨论】:

以上是关于Javascript在调用之前查找函数/类是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:在循环继续之前等待函数结束[重复]

在构造函数之前调用 Typescript/javascript 方法

在 Promise 函数之前链 Javascript 函数仅基于初始函数调用

在JavaScript的原型链继承方式中,为啥子类在调用父类的构造函数时不能传参数?

如何在 ajax 调用中提交表单之前调用 javascript 验证函数

如何检查一个函数是不是被另一个函数调用?