0

我在我的网络应用程序中根据需要动态加载函数。当我根据需要请求这些功能时,我想检查它们是否已经存在。所以我传入一个函数名数组,例如 ['Result','Question']。然后我遍历该数组并想看看它的 typeof 是否是一个函数,如果是,那么我知道我不需要加载它。

这是一个简化版本:

function Result(){}
var functionName = 'Result';
if (typeof functionName == 'function'){
    alert('function exists, don't load it');
else
    alert('function does not exist, load it');

我知道上面的示例不起作用,因为我需要 functionName 的值,而不是 functionName 本身。任何想法如何做到这一点?

4

4 回答 4

3

假设您的函数是全局的,您可以使用window对象(存储全局变量的对象)验证它是否存在。

 if (typeof window[functionName] === 'function') {
     // function exists
 }

JSFIDDLE

于 2013-07-03T18:48:53.380 回答
3

您可以window[functionName]按如下方式使用:

function Result(){}
var functionName = 'Result';
if (typeof window[functionName] == 'function'){
    alert("function exists, don't load it");
          }else{
    alert("function does not exist, load it");
}

但是,您需要确保将单引号转义don't或使用双引号,因为它会终止您的字符串文字。

这是一个工作示例:http: //jsfiddle.net/WN92K/

于 2013-07-03T18:55:08.723 回答
1

你可以这样做,看看你的函数是否是全局的。

if (window[functionName] instanceof Function){
于 2013-07-03T18:49:21.737 回答
0

您可以使用 typeof 并尝试 catch :(window[fctName] 并不总是有效,因为您并不总是在窗口“范围”中,或者您需要测试对象成员(或模拟命名空间等))

function isFunction(fctName) {
    try {
        return typeof(eval(fctName)) === "function";
    } catch (err) {
        return false;
    }
}

function isFunction2(fctName) {
    return typeof(window[fctName]) === "function";
}

var myFunc1 = function () {};
function myFunc2() {};

var aString = "hello world!";

console.log(myFunc1); // function () {}
console.log(myFunc2); // function myFunc2() {}
// Can't work : Exception throw
// console.log(myFunc3);

console.log(window['myFunc1']); // function () {}
console.log(window['myFunc2']); // function myFunc2() {}
console.log(window['myFunc3']); // undefined

console.log(isFunction("myFunc1"));  // true
console.log(isFunction("myFunc2"));  // true
console.log(isFunction("myFunc3"));  // false

console.log(isFunction2("myFunc1"));  // true
console.log(isFunction2("myFunc2"));  // true
console.log(isFunction2("myFunc3"));  // false

console.log(isFunction('aString.toLowerCase'));  // true
console.log(isFunction('aString.toLower'));      // false : toLower doesn't exist

console.log(isFunction2('aString.toLowerCase')); // false : aString.toLowerCase isn't defined ! (but aString was)
console.log(isFunction2('aString.toLower'));     // false : same reason than above

// So Eval can be usefull

http://jsfiddle.net/L6Q9N/2

于 2013-07-03T19:08:16.863 回答