[英]How to check if variable is function in a javascript class method without using eval
i have created this class to check if the function has been loaded.我创建了这个 class 来检查 function 是否已加载。 It works fine, except that I want to avoid using eval to evaluate the function name from a variable.
它工作正常,除了我想避免使用 eval 从变量中评估 function 名称。 I appreciate any help with this.
我很感激这方面的任何帮助。 Thanks.
谢谢。
class scriptLoader {
constructor(fn, max_try) {
this.fn = fn; //the func name being passed as a string
this.count = 0; //init count start value
this.max_try = max_try; //the max times to try
}
waitForScriptToLoad() {
'use strict';
let my_function = eval(this.fn); //this evaluate the string, i.e 'myfunc' to myfunc()
if(typeof my_function === "function") {
my_function();
} else {
if(this.count<this.max_try) {
var that = this;
setTimeout(function() {that.count++; that.waitForScriptToLoad();},100); //wait 100ms and try again
} else {
return false;
}
}
}
} }
I instantiate the class like so:我像这样实例化 class :
loadData = new scriptLoader('Worker.fetch_form_data', 3);
loadData.waitForScriptToLoad();
Assuming that the script you're trying to detect will be located on the global object, split the string by .
假设您尝试检测的脚本将位于全局 object 上,将字符串拆分为
.
s and check to see if the nested property exists on the global object: s 并检查嵌套属性是否存在于全局 object 上:
class scriptLoader { constructor(propsStr, max_try) { this.propsStr = propsStr; //the func name being passed as a string this.count = 0; //init count start value this.max_try = max_try; //the max times to try } waitForScriptToLoad() { 'use strict'; const possibleFn = this.propsStr.split('.').reduce((a, prop) => (a?.[prop]), globalThis); if (typeof possibleFn === "function") { possibleFn(); } else { if (this.count < this.max_try) { console.log('retrying'); setTimeout(() => { this.count++; this.waitForScriptToLoad(); }, 100); //wait 100ms and try again } } } } // Dynamic loading of script: setTimeout(() => { window.obj = {}; }, 50); setTimeout(() => { window.obj.nested = { fn: () => console.log('fn') }; }, 150); const loadData = new scriptLoader('obj.nested.fn', 3); loadData.waitForScriptToLoad();
Also note:另请注意:
const
rather than let
if you don't require reassignment - avoid var
const
而不是let
如果你不需要重新分配 - 避免var
that = this
antipatternthat = this
反模式loadData
is implicitly global since you didn't declare it (consider enabling strict mode at the top level)loadData
是隐式全局的,因为你没有声明它(考虑在顶层启用严格模式)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.