有人可以帮助这个自我调用函数的东西吗?

时间:2010-01-24 23:03:20

标签: javascript

我一直在尝试整天调试这个脚本,我什么也得不到任何帮助,我将不胜感激。

我不断收到一个错误,即错过了大括号或方括号或括号。而且当我尝试获取我的选项的值时,它表示x未定义但是当我输入0作为我的索引时我可以检索opts.value,我的问题是为什么x未定义以及此脚本中缺少什么

prices= (function(){    
          table=document.getElementsByTagName("table");
          selects=table[0].getElementsByTagName("select");
          for(var x=0;x<=10;x++){
            opts=new Array();
            opts=selects[x].getElementsByTagName("option")[selects[x].selectedIndex];
          }
          return{
            value: (function(){
                     val=new Array();
                     for(var i=0;i<=5;i++){
                       val[i]=opts.value
                     }
                     return val;
                   })();,
            total: (function(){}
                     var num="$15.00"
                     var t;
                     for(var j=0;j<=3;j++){
                       t+=num.slice(1).valueOf();
                     }
                     return t
                    })();
          };    
})();

var hello="hello"
document.write("<p>hello</p>");//line just test whether or not function is working
document.write(opts.value);

4 个答案:

答案 0 :(得分:1)

好吧,如果该脚本位于文档的<head>中,它会在创建之前尝试读取DOM元素,除非您通过onload调用它,而不是显示它。

您的另一个选择是在关闭正文之前将<script> ... </script>放在页面底部。虽然我不能100%确定这是问题,因为你还没有发布你的HTML,如果你得到未定义的DOM元素,这是一个公平的猜测。

答案 1 :(得分:1)

闭幕演示

很抱歉,如果我错过任何内容,我没有尝试运行它,因为我保留了您正在使用的html场景。因为它使用document.write,它将从页面上第一个表中的11个选择中返回默认选定的选项值。

// I've changed your "demo" to show the use of a "closure"...
var prices = (function() { //maybe good to add var
    var table = document.getElementsByTagName("table"); //maybe good to add var
    var selects = table[0].getElementsByTagName("select"); //maybe good to add var

    var opts = new Array(); //pull it out of for loop and add var! FYI var opts = []; is equivalent.
    for (var x = 0; x <= 10; x++) { //your test requires at least eleven selects in the first table.
        opts[x] = selects[x].options[selects[x].selectedIndex]; // maybe wanted 11 selected options in a closure?
    }
    return { // remove both anonymous wrappers from your object literal (function(){ ... })();
        value: function() {
            var val = new Array();  //maybe very good to add var
            for (var i = 0; i <= 5; i++) {
                val[i] = opts[i].value; //good to add ; read selected option.value x6 from opts array in closure!
            }
            return val;
        },
        total: function() { // deleted an extra }
            var num = "$15.00"; //add ;
            var t; // must initialize to 0 since you're using +=
            for (var j = 0; j <= 3; j++) {
                t += num.slice(1).valueOf(); //  null +=15.00 x3
            }
            return t; // null, good to add ;
        }
    };
})();
// I'm guessing you've done too much work to have previously defined opts as a global, yes?
document.write(prices.value().join('\r\n<br />')); // selected values copied from the closure

/* //using document.write so all this need to run at the bottom of a page
var hello = "hello"; //good to add ;
document.write("<p>hello</p>"); //line just test whether or not function is working
document.write(opts.value); 
*/

请参阅评论以获取帮助修复price.total等。

答案 2 :(得分:0)

似乎return t缺少分号。

此外,在total:之后的anon-function中,您似乎有成对括号{}后跟更多正文,最后在return t之前以不匹配的闭括号结尾

如果您解决了这些问题,我认为您将更加努力地使用代码

答案 3 :(得分:0)

我没有那么多检查你的代码做了什么,但试图找到你缺少的大括号/语法错误的答案。似乎有很多。我使用适当的缩进重新格式化了上面的代码,并提出了这个:

var prices = (function() {
    table = document.getElementsByTagName("table");
    selects = table[0].getElementsByTagName("select");
    for (var x = 0; x <= 10; x++) {
        opts = new Array();
        opts = selects[x].getElementsByTagName("option")[selects[x].selectedIndex];
    }
    return {
        value:
            (function() {
                var val = new Array();
                for (var i = 0; i <= 5; i++) {
                    val[i] = opts.value;
                }
                return val;
            })() ,
        total:
            (function() {
                var num = "$15.00";
                var t;
                for(var j = 0; j <= 3; j++) {
                    t += num.slice(1).valueOf();
                }
                return t;
            })()
    };
})();

有些事情需要注意:

  • (function() { ... })()定义一个函数(function() { ... }位),然后立即调用它(终止()位)。整个表达式具有函数返回的值。

  • return { value: ..., total: ... }返回一个字典,可以由prices变量引用。请注意,您在var之前(以及prices = ...之前错过了val关键字。此外,在total: function()之后,您需要删除结束大括号,因为后面的内容属于这个功能。

  • 您为opts分配两次(var关键字也可能丢失,除非它在函数外声明)。也许您应该在var opts = new Array()循环之外写for,然后在opts[x]循环内分配到for