0

我正在构建一个 javascript 计算器(使用 jquery mobile)来简化显微镜中的常规计算。我正在寻求创建更高效​​的代码,并希望有任何输入......我不希望任何人深入了解整个事情,但这里是该程序的链接以供参考:http ://www.iscopecalc.com

(计算器的 javascript 位于http://www.iscopecalc.com/js/calc.js

计算器基本上由用户可以设置的大约 12 个输入组成。使用从这些输入接收到的值,计算器生成大约 15 个不同参数的值,并在显示屏上输出结果。目前,每当输入的状态发生变化时,我都会将该更改事件绑定到一个快速函数,该函数将该输入的值写入 cookie。但程序的核心是“updateCalc()”函数,它从所有输入(从存储的 cookie)中读取值,然后重新计算每个要显示的参数并输出它们。为了便于访问,我在这里仅处理了该功能:

function updateCalc(){

readValues();       //load current calculator state into cookies
var data = $.cookie();  //puts all cookie data into object

var fluorData = fluoroTable[data['fluorophore']];  //fluorophore data taken from table at the end of the file depending on chosen fluorophore
    var fluorem = fluorData['fluorem'];
    var fluorex = fluorData['fluorex'];
var cameraData = cameraTable[data['camera']];   //camera data taken from table at the end of the file depending on chosen camera
    var campix = cameraData['campix'];
    var chipWidth = cameraData['chipWidth'];
    var chipHeight = cameraData['chipHeight'];
    var chipHpix = cameraData['chipHpix'];
    var chipVpix = cameraData['chipVpix'];


var RefInd = data['media'];         //simple variables taken directly from calculator inputs
var NA = data['NAslider'];
var obj = data['objective'];
var cammag = data['cameraRelay'];
var CSUmag = data['CSUrelay'];
var bin = data['binning'];

var pinholeRad;
var FOVlimit;
var mode;

if (data['modality']=='widefield'){     //FOVlimit, pinholeRad, and CSU mag will all depend on which modality is chosen
    FOVlimit = 28;
    pinholeRad = NaN;
    mode = 'Widefield';
    CSUmag = 1;
}
else if (data['modality']=='confocal'){
    if (data['CSUmodel']=='X1'){
        pinholeRad = 25;
        if(data['borealis']=='true'){
            mode = "Borealis CSU-X1";
            FOVlimit = 9;
        }
        else {
            mode = "Yokogawa CSU-X1";
            FOVlimit = 7;
            CSUmag = 1;
        }
    }
    else if (data['CSUmodel']=='W1'){
        mode = "Yokogawa CSU-W1";
        FOVlimit = 16;
        pinholeRad = data['W1-disk']/2;
        CSUmag = 1;
    }
}

//These are main outputs and they depend on the input variables above

var latRes = 0.61 * fluorem / NA;
var axRes = 1.4 * fluorem * RefInd / (NA*NA);
var BPpinhole = 1000 * pinholeRad / (obj * CSUmag);
var AU = BPpinhole / latRes;
var totalMag = obj * cammag * CSUmag;
var BPpixel = 1000 * campix * bin / totalMag;
var samples = latRes / BPpixel;
var pixperpin = BPpinhole * 2 / BPpixel;
var sampLit = 1000 * FOVlimit / (obj * CSUmag);
var coverage = FOVlimit * cammag / chipHeight;
if (coverage < 1) {
            chipUsed = coverage;
            FOV = sampLit;
        }   
        else {
            chipUsed = 1;
            FOV = sampLit * chipHeight / (FOVlimit * cammag);   
        }
var sampWaste = 1 - FOV / sampLit;
var imgpix = 1000 * FOV / (chipVpix / bin);

//function goes on to update display with calculated values...
}

它工作正常,我通常对结果感到满意,但这是我想要的建议:

每个输入变量只真正影响少数输出(例如,输入 #3 的变化只会真正改变少数输出的计算……而不是全部 15 个),但是,我的函数重新计算所有输出每次更改任何输入时,无论相关性如何……我都考虑过制作一个巨大的 If-Then 函数,该函数将选择性地仅更新根据更改的输入而更改的输出。这显然需要更多的代码,但我想知道(一旦加载)代码在使用计算器时是否会更快,是否只是浪费我的时间并弄乱我的代码。

我还想知道将输入存储在 cookie 中并从 cookie 中读取值是否是一种合理的做事方式,以及我是否应该创建一个全局变量来存储计算器的状态。(cookie 具有存储用户计算器状态以供以后访问的额外好处)。

我对这些东西很陌生,所以任何和所有关于如何提高我的代码效率的评论都将不胜感激(请随意链接到我应该阅读的页面,或者我应该使用的方法实例...)

如果你已经做到了这一步,谢谢你的时间!!

4

0 回答 0