2

JSONPを使用して外部Webサービスを呼び出し、呼び出し元のページと競合する可能性のあるグローバル関数を作成したくないという事実を回避することを計画しています。ランダムな関数名を作成して渡すとうまくいくと思いました。このようなもの:

<script src="www.foo.com/b?cb=d357534">

ここcbで、はコールバック関数名であり、サーバーは

d357534({my json data});

私が知りたいのは、ランダムな関数名を作成する方法です。使用できると確信していますevalが、これが最善の方法ですか?

基本的に、私がやろうとしていることはこれです:

var d + Math.floor(Math.random()*1000001) = function(){...   
4

3 に答える 3

8

これはあなたが望むことをするはずです。関数名をサーバーに渡すことができるようにどこかに保存する必要がありますが、グローバル名前空間を汚染しないように、ローカルスコープ内でそれを行うことができます。

var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }
于 2010-03-12T19:28:58.673 に答える
1

ランダムな名前のグローバル変数を作成するには、次のようにします。

window['randomvar' + Math.floor(Math.random()*1000001)] = function() { ... };

もちろん、ランダムな名前をどこかで覚えるという問題があります。その変数のランダムな名前を作成することもできます。次に、その変数の名前を覚えておく必要があります。そうすれば、その値を調べて、関数を見つける方法を知ることができます。しばらくすると、物事は奇妙になり始めます。

于 2010-03-12T19:31:07.903 に答える
1

カウンターを使用して、新しい関数が必要になるたびにカウンターをインクリメントしないのはなぜですか。

var name = "callback" + window.COUNTER++;
window[name] = function() { ... };

参照が多すぎるグローバル名前空間を散らかすことを避けたい場合は、カウンターとコールバックを単一のグローバルオブジェクトにアタッチできます(そしてそうすべきです)。

var JSONP = window.JSONP;
var name = "callback" + JSONP.COUNTER++;
JSONP[name] = function() { ... };

この場合、次のようなメソッドを呼び出すことができます。

JSONP.callback_12(json);

大まかに言うJSONPと、最初にオブジェクトとCOUNTER変数を初期化する必要があります。

于 2010-03-29T12:23:06.650 に答える