3

我在 js 中有几个函数(例如这里的第二个代码示例(moveLeft))部分使用相同的代码部分(prepareMove)。(如果我只是在 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);
    };

    ...
}

还有第二个功能

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

一种简单的方法是return the variables you need as an object or an arrayprepareMove.

function prepareMove() { 

   var obj= {},
       obj["currentX"]  = currentX;
       obj["currentY"]  = currentY;
       obj["currentZ"]  = currentZ;
   return 
}

访问另一个函数中的变量。您也可以在此处使用点符号

function moveLeft() {
    var obj = prepareMove();

    var currentX = obj["currentX"],
        currentY = obj["currentY"],
        currentZ = obj["currentZ"],
于 2013-08-10T22:04:44.390 回答
1

如果prepareMove只是分配一堆变量,你可以让它在最后返回一个包含它们的值的对象:

return {
    getCurrent: getCurrent,
    currentX: currentX,
    // ...
};

然后moveLeft你可以将结果分配给一个变量:

var v = prepareMove();

然后,每当您想使用其中一个值时,请在 中访问它v,例如:

if (v.currentZ === 0 && v.currentY !== 0) {
    v.newCurrent(v.currentX, v.currentY - 1, v.currentZ);
    // ...

在一种情况下这不起作用,那就是在内部定义的函数prepareMove更改了它关闭的变量之一。在这种情况下,更改将对 中定义的所有其他函数可见prepareMove,但更改不会传播到v

于 2013-08-10T22:05:12.100 回答
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 回答