0

次のようなJavaScriptコードに取り組んでいます。最初にコードの基本的な骨組みだけを示しています。

var array = [];

function mainFun()
{
     A();
}
function A()
{
    //some code
    B();
    //code to print all values in "array"
}

function B()
{
    C();
}

function C()
{
     //some code
     //push elements one by one in "array"
     for (var i=0; i<10; i++)
     {
           array.push(i); //something on these lines
     }
}

このコードが奇妙に思えることはわかっていますが、これはまさに私が取り組んでいる状況です。Javascript の関数レベルのスコープのおかげで (通常のブロック レベルのスコープとは対照的に)、A()の配列にプッシュされた のすべての要素にアクセスして出力することができませんC()。では、どの要素がプッシュされたかを知る真のグローバル変数のように配列変数を機能させるにはどうすればよいでしょうか?

わかりました、これが私の元のソース コードです (ただし、ダミー コードがどのように機能したかはわかりません!)

var allLinks = {}; //set of all internal and external links
var Queued = [];
var crawlingURL;
var Crawled = [];
var xmlHttp = null, originURL, maxHops = 0, currentHop = 0;

function changeText(){
    var tabID, sourceURL;
    chrome.tabs.query({currentWindow: true, active: true}, function(tabs){
        console.log(tabs[0].url);
        document.getElementById('URL').innerHTML="URL of Current Page : "+tabs[0].url;
        tabID = tabs[0].id;
        sourceURL = tabs[0].url;

        Queued.push(sourceURL); //push the origin link the Queued array to begin crawling
        beginCrawl(sourceURL);
    });
}

document.addEventListener('DOMContentLoaded', function () {
    changeText();
});

function beginCrawl(url)
{
    originURL = url;
    maxHops = 2;
    currentHop = 1;
    var queueIndex = 0;
    //httpGet(originURL);
    while(queueIndex<1) //(currentHop <= maxHops)
    {
        crawlingURL = Queued[queueIndex];
        //allPages[crawlingURL] = {url:url, state:"crawling", level:0, host:startingHost};
        httpGet(crawlingURL);
        Crawled.push(crawlingURL);
        queueIndex++;

        for(var j = 0; j < Queued.length; j++)
        {
            console.log(j+". "+Queued[j]+"\n");
        }
    }
}
function httpGet(theUrl)
{
    xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, true );
    xmlHttp.send( null );
    xmlHttp.onreadystatechange = ProcessRequest;
}

function ProcessRequest()
{
    if ( xmlHttp.readyState == 4 && xmlHttp.status == 200 ) // xmlHTTP success
    {           
            var container = document.createElement("p");
            container.innerHTML = xmlHttp.responseText;
            var anchors = container.getElementsByTagName("a");
            var list = [];
            for (var i = 0; i < anchors.length; i++) 
            {
                var href = anchors[i].href;
                var exists = 0;

                // to check for duplicate entries in the list
                    for(var j = 0; j < Queued.length; j++)  // remove duplicates
                        if(Queued[j] == href)
                            exists = 1;
                    if (exists == 0)
                    {
                        Queued.push(href);
                        document.getElementById('printORGLinks').innerHTML += href + "<br />";
                    }
            }
        }
}

Queued Array の値を出力できません! (ご存じのとおり、これはある種の Web クローラーの予備的なコードです。Queued 配列にプッシュされたすべての URL のリストを取得する必要があります)。

4

1 に答える 1

0

これは入力したとおりに機能します-ここでフィドルhttp://jsfiddle.net/LmFqq/1/

出力

some code executing in A()
some code executing in B()
adding elements in C()
printing in A()
[0,1,2,3,4,5,6,7,8,9]

コード

var array = [];
var el = document.getElementById('output');
mainFun();

function log(msg) {
    el.innerHTML += msg + "<br />";
}

function mainFun()
{
     A();
}

function A()
{
    log("some code executing in A()");
    B();

    log("printing in A()");
    log(JSON.stringify(array));
}

function B()
{
    log("some code executing in B()");
    C();
}

function C()
{
    log("adding elements in C()");
     for (var i=0; i<10; i++)
     {
           array.push(i); //something on these lines
     }
}
于 2013-10-09T16:18:25.620 に答える