我在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
或类似变量)。