1

StoyanStefanovsオブジェクト指向JavaScriptBookから以下の関数を取得した初心者プログラマーです。次の3回呼び出すと、「a」、「b」、「c」の順に出力されるとのことです。Firebugコンソールで試してみると、「a」が表示され続けたので、1つの質問(a)です。つまり、Firebugについて、私の結果を説明する何かがありますか?

次に、jsfiddle.netで実行しようとしましたが、何も出力されません。http://jsfiddle.net/mjmitche/SkSMm/

私はm sure I何か間違ったことをしていますが、何ですか?できれば説明してください。注、next();を実行しました。そしてAを取得し、次にnext();を実行しました。もう一度、'a'とnext();を取得しました。再び'a'を取得しました。言い換えれば、カウンターはt change or didn覚えていませんでした。

function setup(x) {
   var i = 0;
   return function () {
        return x[i++];
    };
}

var next = setup(['a','b','c']);

next();
4

4 に答える 4

1

これが機能することを示すjsfiddleリンクです。

http://jsfiddle.net/ZnZTk/

于 2011-04-15T05:19:43.920 に答える
1

JsFiddleはコンソールとは異なり、戻り値を出力するウィンドウがありません。コードの結果は、右下に表示されているWebページです。

alertこのメソッドを使用して、値を表示できます。

alert(next());

http://jsfiddle.net/SkSMm/4/

ご覧のとおり、3回呼び出すnextと、実際には配列に3つの値が出力されます。このsetup関数は、関数で作成された匿名関数へのデリゲートを返します。その無名関数はそれ自体の外部の変数を使用しますが、それらは周囲の関数に対してローカルであるため、関数のクロージャが作成されます。クロージャーにはix変数が含まれます。クロージャはデリゲートに属しているため、ある関数呼び出しから次の関数呼び出しまで存続し、その変数の値を保持します。

グローバル変数を使用するだけで、同様のことができます。

var x = ['a','b','c'];
var i = 0;

function next() {
  return x[i++];
}

alert(next());
alert(next());
alert(next());

変数は関数の外部で宣言されているため、関数呼び出し間で存続します。

グローバル変数を使用することの欠点は、変数に非常に一意の名前が付けられていない場合、あるスクリプトが別のスクリプトと簡単に衝突することです。クロージャを使用する場合、あるスクリプトの変数が別のスクリプトの変数と競合するリスクはありません。

于 2011-04-15T05:26:10.633 に答える
0

あなたはそれを間違えました: ここに画像の説明を入力してください

そしてjsfiddle: http: //jsfiddle.net/ZHgW2/

于 2011-04-15T05:14:53.600 に答える
0

これは、インポートされたsay関数を利用し、ボタンに依存する優れたデモです。

http://jsfiddle.net/entropo/wxTqR/

これは、ログやアラートに依存せずにスクリプトをテストするための優れた方法です。

このsay関数は、jQueryinActionからのものです。抜粋:

この関数内で、「コンソール」と呼ばれるページ上で動的に作成された要素にテキストメッセージを送信するために使用する小さなユーティリティ関数say()Cのサービスを使用します。この関数は、インポートされたサポートスクリプトファイル(jqia2.support.js)内で宣言されており、ページで問題が発生したことを示すために迷惑で混乱を招くアラートを使用する手間を省くことができます。この本の残りの部分では、多くの例でこの便利な関数を使用します。
于 2011-04-15T05:29:15.840 に答える