質問

私は潜在的に呼び出しページと競合する可能性があり、グローバル関数を作成したいいけないということを回避するために、外部Webサービスを呼び出すためにJSONPを使用する予定。私は、ランダム関数名を作成し、それを渡すと働くだろうと思いました。このような何かます:

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

CBは、コールバック関数の名前であり、サーバが返します。

d357534({my json data});

私が知りたいことは、私がevalを使用することができますことを確認イム、ランダム関数名を作成する方法であるが、これはそれについて移動する最良の方法は何ですか?

基本的に、私は何をしようとしていることはこれです:

var d + Math.floor(Math.random()*1000001) = function(){...   
役に立ちましたか?

解決

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

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

他のヒント

あなたがこれを行うことができ、ランダムな名前のグローバル変数を作成するには:

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

今のコース、あなたはどこかにランダムな名前を覚えるの問題を持っています。あなたもの変数のランダムな名前を作ることができます。そして、あなたはその値を見て、その後、あなたの関数を見つける方法を知っていることができるように、のことの変数の名前を覚えておく必要があるだろう。しばらくして、物事は奇妙な取得を開始しようとしている。

なぜ、ちょうどカウンターを使用し、それにあなたが新しい機能を必要とするたびに増加しません。

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

あなたはあまりにも多くの参照とグローバルな名前空間を散らかさないようにしたい場合は、あなたができた(とすべきである)単一のグローバルオブジェクトにカウンターとコールバックを添付します:

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

この場合、あなたは次のようにメソッドを呼び出すことができます:

JSONP.callback_12(json);

粗いのは、最初JSONPobjectとCOUNTER変数を初期化する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top