1

次のコードがあります。

var stats = {
....,
checkExistance :
function(url){
    var newUrl = url.substring(0, url.lastIndexOf("/")) + "/asyncCheckChartExistance";
    var xhrObj = stats.getXhr();

    var poolInterval = setInterval("poll()", 100);

    function poll(){
        xhrObj.open("GET", newUrl, true);
        xhrObj.send(null);

        xhrObj.onreadystatechange = function(){
            if(xhrObj.readyState === 4 && xhrObj.status === 200){
                if (xhrObj.responseText.length === true){
                    console.log("Exists!");
                    clearInterval(poolInterval);
                } else {
                    console.log("Not Yet!");
                }
            }
        }
    }
},
}

stats 名前空間を作成しました。この名前空間では、毎秒サーバーをポーリングする関数を作成しようとしています。この関数には次の方法でアクセスする必要があります: stats.checkExistance(myUrl).

ただし、setInterval関数は関数を見ることができないようpoll()です。これらが別の関数内にネストされていることを考慮すると、これは通常の動作であることはわかっています。

これをグローバル名前空間に記述しても問題はありませんが、この種の名前空間でこれを機能させることに興味があります。何か案は?ありがとう!

4

3 に答える 3

2

に文字列を渡すとsetInterval、その文字列はグローバル コードとして解釈され、pollはグローバル関数ではないため、参照エラーがスローされます。

ただし、文字列の代わりに関数参照を渡すことができます。poll関数は呼び出しが行われるスコープで使用できるsetIntervalため、次のように記述できます。

var poolInterval = setInterval( poll, 100 );
于 2012-07-26T13:47:45.063 に答える
2

に文字列を渡すとsetInterval、グローバル スコープで実行されます。デフォルトでは、関数pollのスコープ内にしか存在しないため、定義されません。checkExistance

setIntervalこの問題を解決するには、代わりに匿名関数を渡します。

var poolInterval = setInterval(function () {
    poll();
}, 100);

匿名関数を渡すことは、通常、1 つの関数を呼び出すだけでなく、間隔の JavaScript 式/ステートメントを記述できるため、最良のアイデアです。

于 2012-07-26T13:50:37.140 に答える
1
var stat = {
    say: function(name){
        function doit(){
            console.log(name);
        }
        setInterval(doit, 1000);
    }
};
stat.say("hi");​​​​​​​​​​​

方法を示す簡単なデモ。毎秒「こんにちは」が表示されます。

于 2012-07-26T13:57:12.710 に答える