0

Web アプリで必要に応じて関数を動的にロードしています。必要に応じてこれらの機能を要求するとき、それらが既に存在するかどうかを確認したいと思います。そこで、['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 に答える
1

これを実行して、関数がグローバルかどうかを確認できます。

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

typeof を使用して catch を試すことができます: (ウィンドウ [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 に答える