3

コードの同じ部分 (prepareMove) を部分的に使用するいくつかの関数 (たとえば、ここの 2 番目のコード サンプル (moveLeft)) を js で取得しました。(コードは、moveLeft 内に prepareMove をコピーするだけで問題なく動作します)

私がしたいこと:イベントが発生する - > prepareMoveが開始する - > moveLeftが開始する(prepareMove関数のスコープにアクセスしている間)

moveLeft内でprepareMoveを呼び出すだけで、moveLeftはprepareMoveで割り当てられた値を取得できないため、スコープの問題が発生すると思います。

このスコープの問題にどのように対処できますか? 私が使用できるdjangoのblock.superのようなものはありますか(〜親コンテナのコー​​ドを子に渡し、両方を実行します)?javaScript でこの問題にアプローチする適切な方法は何ですか?

function prepareMove() {
    var getCurrent = ptPageXYZarray.filter( function (el) {
                return el.isCurrent === true;
            })[0];

    var currentX = getCurrent.x,
        currentY = getCurrent.y,
        currentZ = getCurrent.z,
        currentYmax = getCurrent.yMax,
        currentZmax = getCurrent.zMax;

    var newCurrent = function (a,b,c) {
        newCurrent = ptPageXYZarray.filter(function(obj) {
                      return obj.x == a && obj.y == b && obj.z == c;
                    });
        return newCurrent;
    };

    var outAnimation = function (outAnimationClass) {
        getCurrent.ptPageObj.className += ' ' + outAnimationClass;
        function removeOutAnimation() {
                removeClass(getCurrent.ptPageObj, outAnimationClass);
        }
        setTimeout(removeOutAnimation,700);
    };

    ...
}

そして2番目の機能があります

function moveLeft() {
    prepareMove(); //scope issues here?
    if (currentZ === 0 && currentY !== 0) {
            newCurrent(currentX,currentY -1,currentZ);

            outAnimationClass = "mm-page-visible mm-page-moveToRightFade";
            outAnimation(outAnimationClass);

            swapCurrentEls();

            inAnimationClass = "mm-page-visible mm-page-moveFromLeft";
            inAnimation(inAnimationClass);

        } else
        ...
};

イベントでmoveLeft関数を開始します

moveLeft();

進行中の作業 (矢印を使用): http://www.mymlyn.com//page-templates/css-transitions-keyboard/

ビットバケット: [https://bitbucket.org/mymlyn/mymlyn.com/overview][2]

4

3 に答える 3

1

これを実現する最も簡単な方法は、オブジェクトを使用することです。prepareMove必要なすべてのプロパティをオブジェクトに入力して返し、moveLeftそれらを使用します。

構造を多少変更することもできます。

function effect() {

    // private

    var getCurrent = ptPageXYZarray.filter( function (el) {
            return el.isCurrent === true;
        })[0];

    var currentX = getCurrent.x,
        currentY = getCurrent.y,
        currentZ = getCurrent.z,
        currentYmax = getCurrent.yMax,
        currentZmax = getCurrent.zMax;

    ...

    var r = { };

    // public (everything in r)

    r.left = function( ) {
        if (currentZ === 0 && currentY !== 0) {
            newCurrent(currentX,currentY -1,currentZ);

            outAnimationClass = "mm-page-visible mm-page-moveToRightFade";
            outAnimation(outAnimationClass);

            swapCurrentEls();
            ...
        } ...
    };

    r.right = function( ) {
        ...
    };

    ...

    return r;
}

effect( ).left( )またはのように呼び出すことができますeffect( ).right( )。電話をかけるeffect( )だけで準備は整いますが、実際には何の役にも立たないので問題ありません。プライベート関数やその他の凝ったものを使用することもできます。

元の質問については、いいえ、呼び出している関数のスコープを設定することはできません。変数のみthis(経由callまたは類似)。

于 2013-08-10T22:05:44.600 に答える