stack overflow是因为jscript的stack层次大概只有100个左右(好像和本机当前可用内容有关,没看到权威的数字,是自己在window2000+IE5.5上测试所得)所以当函数调用层次超过100时,会报此错误,并自动回到最上层,而且该错误不能被try ... catch我没看懂楼主的意思,把你程序贴出来看看

解决方案 »

  1.   

    /**
    *定义正则表达式
    */
    var digitalExp = /\W+/i;
    //var symbolExp = /^(\+)*(\-)*(\*)*(\/)*(\>)*(\=)*$/i;
    var symbolExp = /\w*/i;/**
    *校验表达式的合法性
    */
    function validExp(exp){
    if(exp == "") return false;
    if(exp == ";") return false;
    if(exp == " ") return false;
    if(exp.test(/\0/)) return false;
        
        return true;
    }/**
    *去除空格函数
    */
    function String.prototype.Trim(){
    return this.replace(/\s*/g,"");
    }/**
    *
    *字符串转换浮点数
    */
    function char2double(str){
        if (str=="")
        return 0.00;
        else return parseFloat(str);
    }/**
    *
    *字符串转换浮点数
    */
    function char2int(str){
        if (str=="")
        return 0;
        else return parseInt(str);
    }/**
    *
    *拆分数字数组
    */
    function parseDigital(express){
    return express.split(digitalExp);
    }/**
    *
    *拆分公式数组
    */
    function parseSymbol(express){
    return express.split(symbolExp);
    }/**
    *
    *打印输出计算函数
    */
    function printFun(funName,funBody,inputName){
    var s;
    s = '<'+'script language=javascript>';
    s += 'function '+funName+'{';
    s += 'with(document.all){';
    s += funBody+';';
    //s += 'FormatNumber('+inputName+',2);';
    s += '}';
    s += '}';
    s += '<'+'/script>';
    document.writeln(s);
    }/**
    *构造数学计算表达式String  constructFunBody(digital,symbol),两个参数均为数组
    */
    function constructFunBody(digital,symbol){
    var tempChar = '';//转换后的计算表达式
    var tempbnlj1 = "value";
    var tempbnlj2 = "value";
    /*判断计算dataFld 或者value*/
    if(digital[0] == digital[1]){
        tempbnlj1 = "dataFld";
    }
    else if(digital[0] == digital[2]){
         tempbnlj2 = "dataFld";
    }
    /*构造计算表达式*/
        for(m = 0; m < digital.length; m++){
       if(symbol[m] != null){
        if (m == 0)
                    tempChar += digital[m]+".value"+symbol[m];
                else
                    tempChar += "char2double("+digital[m]+"."+tempbnlj1+")"+symbol[m];
                }else 
             tempChar += "char2double("+digital[m]+"."+tempbnlj2+")";
        }
        return tempChar;
    }
    /**
    *绑定动态函数
    */
    function bondExpFun(inputName,funNameTotal){
    try{
        with(document.all){
            for(n = 0; n < inputName.length; n++){
             if(funNameTotal[n] == "") 
                 continue;
             if(inputName[n].readOnly != true ){
                    inputName[n].onchange = new Function(funNameTotal[n]);
                }
                else  
                    inputName[n].onpropertychange = new Function(funNameTotal[n]);
            }
        }
        }catch(E){}
    }/**
    *取索引函数;根据inputname取得objInput中的索引值
    */
    function getInputIndex(inputname){
       for(kv = 0;kv < objInput.length;kv++){
           if(objInput[kv].name == inputname){
              return kv;
              break;
           }
       }
    }/**
    *
    *解析express表达式,打印动态生成的函数,并将其绑定到相应的INPUT
    */
    function parseFun(express){
    /*包含一个以上的表达式时*/
    if(express.indexOf(';') > -1){
        var expArray = express.split(';');
    var digital = new Array();
    var symbol = new Array(); /*将拆分结果分别存入两个临时数组*/
    for(kx = 0; kx <expArray.length; kx++){
                digital[kx] = parseDigital(expArray[kx]);
                symbol[kx] = parseSymbol(expArray[kx]);
            }
            
            /*遍历表达式数组,输出动态函数*/
    for(x = 0;x < digital.length; x++){

        /*构造动态函数expString*/
            var expString = constructFunBody(digital[x],symbol[x]);
        
                /*动态动态函数名funName*/
            var funName = "cal"+digital[x][0]+"()";
            for(jx = 1;jx < digital[x].length;jx++){
                funNameTotal[getInputIndex(digital[x][jx])] += funName+";";
            }           
        
              /*打印动态函数*/
             printFun(funName,expString,digital[x][0]);
            }
    }else{
        var digital = parseDigital(express);
        var symbol = parseSymbol(express);       var expString = constructFunBody(digital,symbol);
        
        var funName = "cal"+digital[0]+"()";
        
        for(jx = 1;jx < digital.length;jx++){
            funNameTotal[getInputIndex(digital[jx])] += funName+";";
        }
         printFun(funName,expString,digital[0]);
        }
    }/**
    *初始化input数组
    */
    var objInput = document.getElementsByTagName("INPUT");//取得所有input数组
    var funNameTotal = new Array();
    /**
    *
    *初始化主函数
    */
    function init(){
    try{
    /*取得INPUT集合*/
    var inputLen = objInput.length;

    /*根据input数组长度初始化动态函数数值funNameTotal为空*/
    for(ix = 0 ;ix < inputLen ;ix++){
        funNameTotal[ix] = "";
        }
    /*遍历INPUT,如果存在计算公式,则解析之*/
    for(k = 0; k < inputLen; k++){
    if(typeof(objInput[k].exp) == "undefined"&&objInput[k].exp != '')
        continue;
    var express = objInput[k].exp;
    //if(exp != ""){
            parseFun(express.Trim());
    //}

        }
        /*绑定所有动态函数*/
        bondExpFun(objInput,funNameTotal);
        }catch(E){}
    }
      

  2.   

    表达式写法:
    计算关系a3=a1+a2;<input name=a1>
    <input name=a2>
    <input name=a3 exp="a3=a1+a2">