Есть некоторый объект, в моём случае это карта уровня(речь пойдёт о значениях в массивах):
var levelTest={
"y":{
"20":[[20,100]],
"24":[[40]],
"28":[[75]],
"30":[[20,50],[60,100]]
},
"x":{
"20":[[20]],
"40":[[20,24],[32,40]],
"75":[[20,28],[36,40]]
}
};
Есть функция копирующая этот объект попутно преобразующая значения координат из относительных(100 в ширину и 120 в высоту) в реальные положения пикселей(конкретные места присвоения указаны комментариями)
function testLevelToPixel(){
levelTestPix.x={};
levelTestPix.x.mass=[];
for (xx in levelTest.x){
levelTestPix.x.mass.push(xPixel(xx));
levelTestPix.x[xPixel(xx)]=[];
for (var i=0;i<levelTest.x[xx].length;i++){
levelTestPix.x[xPixel(xx)][i]=[];
levelTestPix.x[xPixel(xx)][i][0]=function(){return yPixel(levelTest.x[xx][i][0])};//Присвоение первого элемента
if(levelTest.x[xx][i][1]){
levelTestPix.x[xPixel(xx)][i][1]=function(){return yPixel(levelTest.x[xx][i][1])+xPixel(1);}//Присвоение второего эелемента
if (levelTest.x[xx][i][0]%1>0&&levelTest.x[xx][i][1]%1>0)
levelTestPix.x[xPixel(xx)][i][2]="<>";
else if(levelTest.x[xx][i][0]%1>0)
levelTestPix.x[xPixel(xx)][i][2]=">";
else if(levelTest.x[xx][i][1]%1>0)
levelTestPix.x[xPixel(xx)][i][2]="<";
}else{
levelTestPix.x[xPixel(xx)][i][1]=yPixel(levelTest.x[xx][i][0])+xPixel(1);//Присвоение второго элемента, при особых случаях
}
wallRender(xPixel(xx),levelTestPix.x[xPixel(xx)][i],true);
}
}
}
функция приведена не полностью, так как вторая часть функции абсолютно такая же, только для "y". Встала задача сделать значения в массивах изменяемыми путём замены в копируемом объекте констант на функции.
levelTestPix.x[xPixel(xx)][i][1]=yPixel(levelTest.x[xx][i][1])+xPixel(1);
-->
levelTestPix.x[xPixel(xx)][i][1]=function(){return yPixel(levelTest.x[xx][i][1])+xPixel(1) /*+T*/;}
Вопрос номер один, в такой компоновки внутри функции будет ссылка на функцию yPixel() и соответственно ссылки на levelTest.x[xx][i][1], или же всё таки значения?
И в случае таком, что будет фигурировать в конечной функции, или как в конечную функцию прописать значения?
var const=yPixel(levelTest.x[xx][i][1])+xPixel(1);
levelTestPix.x[xPixel(xx)][i][1]=function(){return const/*+T*/;}
И второй вопрос производительности, есть функция которая использует скопированный объект, что будет отрабатываться быстрее:
Если я каждое значение сделаю функцией и буду каждый раз вызывать эту функцию даже если она function(){return const}
obj[aaa][i][0]=obj[aaa][i][0]();
Или же добавить проверку на функцию:
if (typeof obj[aaa][i][0] == 'function') {
obj[aaa][i][0]=obj[aaa][i][0]()}
else{
obj[aaa][i][0]=obj[aaa][i][0]
}
функции yPixel и xPixel имеют следующих вид:
wID = window.innerHeight<window.innerWidth?window.innerHeight:window.innerWidth;
hEI = window.innerHeight>window.innerWidth?window.innerHeight:window.innerWidth;
yZer = Math.round(hEI-wID*1.2);
function yPixel(y){
return Math.round(y*wID/100+yZer);
}
function xPixel(x){
return Math.round(x*wID/100);
}
Всё это подели лежит на
http://poe.bl.ee/ipoint, текст рассматриваемой функции на
http://poe.bl.ee/ipoint/point.js