6

私は自分の JS コードを酷使しているだけで、自分eval()のを に置き換えたいと思っていwindow[functionName]ます。そのため、JSFiddle で簡単なテストを行ったところ、すべて次の行でうまく機能します。

var fnName = "Page_test";
var foo = "yammy";
var Page_test = function(bar) {
    return bar;
}
var Obj = window[fnName];
alert(Obj(foo));

(この JSFiddle へのリンク-> http://jsfiddle.net/juSHj/ )

eval()ここで、次のコード行を上記の概念の悪に置き換えようとします。

古いコード: (魅力のように動作する / ajax の成功後に起動)

 ...
 success: function(ret) {
     if(returnFnAjaxForm != "") {
          eval(returnFnAjaxForm+"('"+encodeURI(jQuery.trim(ret))+"')");
     }
 }
 ...

新しいコード:

戻り値: Uncaught TypeError: オブジェクト [オブジェクト Window] のプロパティ 'dummyFn' は関数ではありません

...
success: function(ret) {
     if(returnFnAjaxForm != "") {
          fnObj = window[returnFnAjaxForm];
          if(typeof(fnObj) == "function") { // this is optional
               fnObj(encodeURI(jQuery.trim(ret)));
          }
     }
} 
...

どこで間違えたのか気になります。はい、起動しようとしている関数が存在し、で定義されていvarます。この概念は、ajax 応答で使用できない可能性がありますか?

助けてくれてありがとう。

(jQueryを使用)

4

1 に答える 1

13

関数をクロージャーで宣言すると、それは window のメンバーではありません。例 :

var in_window = '132';
alert(window['in_window']); // Alert 132

(function() {
    var not_in_window = '132';
    alert(window['not_in_window']); // Alert undefined
})();

Page_testしたがって、変数を宣言する場所に注意してください。本当にウィンドウに入れたい場合は、できますwindow.Page_test = Page_test

最善の方法は、考えられるすべてのコールバックにオブジェクトを使用することです。このような :

var callbacks = {
    foo : function() {},
    foo1 : function() {},
    foo2 : function() {},
    foo3 : function() {}
};

var obj = callbacks[fnName];
于 2013-01-18T16:20:02.953 に答える