1

これは非常に単純な質問/問題であり、簡単に回避できますが、JavaScriptを学習しているので、なぜこの特定の問題が発生しているのかを知りたくなりました。

$("#go").click(function() {
    $("p").append(array[x] + " ")
    functionlist[array[x]]()
    x++
})​

これは私が期待するようには機能しません。配列の現在のコンテンツを書き込み、特定の関数名に関連付けられた単純なアニメーションを実行してから、xをインクリメントしたいと思います。xをインクリメントしないことを除いて、すべてが機能します。

私がこれを行う場合:

$("#go").click(function() {
    $("p").append(array[x] + " ")
    //functionlist[array[x]]()
    x++
})​

xは正常にインクリメントされます。

だから私の質問は、なぜこれが起こるのですか?

これが私が使用しているjsfiddleへのリンクです:http://jsfiddle.net/mxy6N/3/

4

1 に答える 1

5

スクリプトコンソール(ほとんどのブラウザはF12)を確認すると、functionlist[array[x]]()次のようなエラーがスローされることがわかります。

オブジェクトにはメソッド「smooch」がありません

これは、array[x]が「smooch」に等しく、functionlist["smooch"]定義されていないため、に到達する前にエラーが発生するためx++です。

このコードで起こっている他のこと:

  • xは関数内で宣言されているため、使用時には常に0になります。
  • 関数の外部で宣言されている場合でも、インクリメントすると、配列で確認するアイテムが不足します。ここでは、1つまたは2つのモジュロ演算子を使用する必要があります。
  • $ .fn.transitionの定義を持つ.jsファイルを参照していないため、遷移呼び出しもエラーになります。
  • flip両方ともflop同じrotateY値なので、一度「反転」すると「フロップ」しません

これがあなたがやろうとしていることをするかもしれない何かです:http://jsfiddle.net/g5mJd/3/

そして更新されたコード:

var array = ["smooch", "jab", "flip"];
var move = "flip";
var x = 0;
var functionlist = {
    flip: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '180deg'
        }, 1000);
    },
    flop: function() {
        $("#block").transition({
            perspective: '0px',
            rotateY: '0deg'
        }, 100);
    }
};


$("#go").click(function() {
    var functionName = (x % 2 == 0) ? 'flip' : 'flop';
    var fn = functionlist[functionName];
    if($.isFunction(fn)) {
        fn();
    }
    var say = array[x % array.length];
    $('p').append(say + ' ');
    x++;
})​;

$.isFunction()編集:チェックで更新。

于 2012-11-27T01:27:16.357 に答える