我在js中有几个函数(例如,第二个代码示例(moveLeft))在JS中部分使用了同一部分代码(prepareMove)。
(如果我只是在moveLeft中复制prepareMove,代码就可以正常工作)

我想发生的事情:事件发生-> prepareMove初始化-> moveLeft初始化(在访问prepareMove函数作用域时)

我想简单地在moveLeft内部调用prepareMove会引起一些范围问题,因为moveLeft无法检索在prepareMove中分配的值。

我该如何解决这个范围问题?我可以使用django的block.super之类的ree东西吗(〜将父容器中的代码传递给child并执行两者)?在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);
    };

    ...
}

还有第二个功能
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]

最佳答案

实现此目的的最简单方法是使用对象。 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( )即可完成准备工作,但由于实际上没有任何作用,因此没有关系。您还可以使用私有(private)功能和其他花哨的东西。

至于您的原始问题,不,您无法设置要调用的函数的范围。仅this变量(通过call或类似变量)。

10-06 00:11