1

すべてのソース コードはここから入手できます: ページのソースを表示するだけです。コードの半分はそのページにあり、残りの半分はソースにリンクされている「deputyDepot.js」ファイルにあります。

いくつかのこと: これは明らかにまだ進行中の作業です。私はコーディングをしているときはかなりまとまりがなく、あちこち飛び回って、あれこれあれこれあれこれとちょっとしたことをする傾向があります。だから少し面倒です。背景も。存在しないふりをするだけですよね?

では、問題に移りましょう!どの関数でも配列にアクセスできないようです。

現在、私がテストしている方法は、メイン関数 (weTalkNow(input) と呼ばれる) を変更することです。これは deputyDepot.js にあります。テストしている値を返すように設定して、それらが何に設定されているかを確認します。これらの値は、私のチャット ボックスに表示されます。だから私はconsole.log()のように使います。現在、ユーザー入力の長さを返すように設定されていますが、それはまったく関係ありません。

_inputArray は、ユーザー入力 (文字列) を取得し、それをスペースで分割することによって設定されます。ページの上部に宣言されています。これはすべてうまくてダンディです。

問題が発生するのは、アレイが手動で設定された場合です。

var x = [ [1,2], [3,4] ];
/* Main Function */
function weTalkNow(){
    return x[0][0];
}

私が知る限り、そのコードは 1 を出力する必要があります。しかし、そうではありません。コードを次のように変更すると、正常に動作します。

/* Main Function */
function weTalkNow(){
    var x = [ [1,2], [3,4] ];
    return x[0][0];
}

ただし、これはあまり役に立ちません。ローカル配列ではなく、グローバル配列が必要です。

物事を本当に奇妙にしているのは、宣言することにした場合

var x = [ [1,2], [3,4] ];

私のメインページ(HTMLなどを含むページ)で、これを行います

/* Main Function */
function weTalkNow(){
    return x[0][0];
}

deputyDepot.js ファイルでは、正常に動作します。突然、別のページでグローバル配列を宣言すると、問題なく動作します。

何らかの点で明確にすることができるかどうか教えてください。私はできる限りの情報を提供しようとしました。ランダムな副次的なヒントも大歓迎ですが、私は主にこれに焦点を当てています.

繰り返しますが、はっきりしているように、何らかの理由で、手動で配列を設定すると、配列を使用できません(これは何らかの形で問題に関連していると思います)。_inputArray は正常に機能しているため、配列は正常に機能します。これは、これを行う唯一のグローバル配列です。ただし、手動ではなく、分割機能によって設定されます。関数からアクセスできるグローバル配列を作成できないようです。

編集:

さて、私は問題を見つけました!私が書いていたすべてのコードは、想定どおりに正常に動作します。問題は、私の .js ファイルの一番上に壊れた関数があったことです。この最初の行は、その下にあるすべてのコードの実行を妨げたため、そもそも配列が初期化されることはありませんでした。このため、それらにアクセスできませんでした。

Web コンソールを確認すると、すべてを修正できました。この質問を投稿する前に、Web コンソールがあることを知りませんでした。

4

1 に答える 1

1

関数が呼び出される行の下で宣言された配列を関数が参照する場合、その配列はスコープ内にありません。

myFunc();

function myFunc () {
    console.log(ra[0]); // won't work
};

var ra = ["a"];

これはうまくいきます:

var ra = ["a"];

myFunc();

function myFunc () {
    console.log(ra[0]); // will work
};

心に留めておくべきもう 1 つのことは、javascript インクルードも順番に処理されるということです。もう 1 つ: 一般的に JavaScript は上から下に処理されます。関数は、ファイルの下の行で定義されている変数を呼び出したり参照したりできません。例外があります。例外は、使用している名前付き関数です。

これはうまくいきません。

var funcA = function () {
    funcB(); // wont work
};

funcA();

var funcB = function () {
    console.log("from funcB");
};

これはうまくいきます:

funcC(); // works fine

function funcC () {
    funcD(); // works fine
}

function funcD () {
    console.log("from funcD");
};

これらの微妙な違いは、完璧なデザインとは言えないかもしれませんが、うまく機能します。

于 2012-12-01T19:32:00.633 に答える