提问人:Bruno Natali 提问时间:3/25/2020 更新时间:3/25/2020 访问量:1994
如何使用 Javascript 检查另一个函数中是否存在函数
How to check if function exists inside another function using Javascript
问:
我正在尝试构建一个按需加载脚本的函数。这是我当前的代码:
function loadScript(src, name = null)
{
var dfd = jQuery.Deferred();
if (name === null) {
name = src.split(/\\|\//); // split by folder separator
name = name[(name.length - 1)].split('.'); // catch last index & split by extension
name.splice(name.length - 1, 1) // Remove last
name = name.join('.'); // add points in the middle of file name
}
if ( typeof name === 'function' ) return dfd.promise().resolve(name);
$.getScript( src )
.done(function( script, textStatus ) {
dfd.resolve(name);
})
.fail(function( jqxhr, settings, exception ) {
dfd.reject(exception);
});
return dfd.promise();
}
我的问题出在代码的这一部分:
if ( typeof name === 'function' ) return dfd.promise().resolve(name);
其中 name 是一个变量,其中包含要检查的所需函数名称,但不是真正的函数名称,导致函数从不计算为“function”。
我试过了:
typeof `${name}` // resulting a "string"
eval("typeof name === 'function'") // But my node system not accept eval due to a potentially security risk
我有多少种选择?
答:
0赞
Guerric P
3/25/2020
#1
你可以做,或者如果函数是全局的,typeof eval(name) === function
typeof window[name] === function
演示:
(function() {
function test() {}
(function(name) {
console.log(typeof eval(name) === 'function');
})('test');
})();
评论
0赞
Bruno Natali
3/25/2020
正如我所说,eval() 不是替代方案
0赞
Guerric P
3/25/2020
好吧,我读得太快了,那么除非它是一个全局函数,或者除非它附加到一个特定的对象,否则这是不可能的,是吗?
0赞
Bruno Natali
3/25/2020
我真的不知道,我用Jquery getScript动态加载脚本。此脚本包含类或函数。为了防止重新声明函数,如果需要评估并防止脚本再次加载。
0赞
Guerric P
3/25/2020
好的,那么你要找的函数必须是全局的。你试过了吗?typeof window[name] === function
0赞
David Watson
3/25/2020
#2
简单快速:
if ( typeof name === 'string' && typeof eval(name) === 'function' ) return dfd.promise().resolve(name);
因为在将名称传递给 Eval 之前,您可能希望仔细检查该名称实际上是 A。如果它来自用户输入,您可能还想进一步验证它,因为您可能会向脚本注入敞开心扉。
0赞
OO7
3/25/2020
#3
希望这可以帮助任何人;
const getFunc = (s) => {
const a = s.split(".");
let obj = window, i = 0;
while (i < a.length && (obj = obj[a[i++]]) !== undefined);
if (typeof obj === "function") return obj;
};
console.log(getFunc("Infinity.isFloat"));
评论
window[name]