0

コールバックとして使用したい文字列の配列がありますが、以下のコードは機能していません。

関数を実行すると、が含まれている場合にのみエラーがTypeError: fn is not a functionログに記録されます。callback_arrayupdate_front_page_images

callback_arrayupdate_front_page_images現在、実行したい関数の名前である要素()は1つしか含まれていません。

誰かが私が間違っていることを教えてもらえますか?

function run_reset_callbacks(callback_array){

    for(var key in callback_array){

        try {
            fn = window[callback_array[key]];
            fn();
        }
        catch(err) {
            console.log('Function \''+callback_array[key]+'\' does not exist. '+err);
        }

    }

}
4

3 に答える 3

1

このモデルを使用する場合は、window[] として呼び出すことができる方法で関数を定義していることを確認してください。関数を window オブジェクトの変数として定義する必要があります。標準関数定義は失敗します。

http://jsfiddle.net/HpXYM/2/

//Works
window.hello = function () {
  alert("hello");
};

//Works    
test = function () {
  alert("test");
};

//Fails
function fail() {
  alert("fail")
};

この方法に設定されている場合、これで問題は解決するはずですが、Matt Ball のアドバイスに従うことをお勧めします。

于 2013-01-14T15:57:59.730 に答える
0

スコープを変更してください!アクセスできないと思いますwindow

JSフィドルリンク

var outputDiv = document.getElementById('output');

// Wrong
var cbArray = ['update_front_page_images', 'dummyFunction']; // Array created from PHP

function update_front_page_images() {
    outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "update_front_page_images" !!';
}

function dummyFunction() {
    outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "" !!';
}
// -- Wrong


// Right
var cbArray = {
    'update_front_page_images': function() {
        outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "update_front_page_images" !!';
    },
    'dummyFunction': function() {
        outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "dummyFunction" !!';
    }
}
// -- Right

// your Code
function run_reset_callbacks(callback_array){

    for(var key in callback_array){

        try {
            fn = window[callback_array[key]]; // Wrong
            fn = callback_array[key]; // Right
            fn();
        }
        catch(err) {
            outputDiv.innerHTML = 'Function \''+callback_array[key]+'\' does not exist. '+err;
        }
    }

}

run_reset_callbacks(cbArray);
于 2013-01-14T16:26:23.620 に答える
-1

配列は、インデックス付きループで列挙する必要があります。

for (var i = 0; i < callback_array.length; i++) { ...  }

callback_arrayが実際にリテラル オブジェクトである場合は、上記の方法で問題ありませんがhasOwnProperty、プロパティを評価する前に確認する方が安全です。

if(callback_array.hasOwnProperty(key)) { ... } // use it

update_front_page_imagesそれ以外の場合は、がグローバル スコープ内にあり、この関数が呼び出された時点で評価の準備ができていることを確認してください。

于 2013-01-14T15:54:58.560 に答える