2011-05-19 126 views
0

IM与脚本挣扎在方法/对象返回undefined功能是未定义

var Lang = new function(){ 
    this.get = function(str, trans){ 
     if(TRANSLATE[str]){ 
      var str = TRANSLATE[str][LANG]; 
      if(count_obj(trans) > 0){ 
       for(var key in trans){ 
        str = str.replace('%'+key+'%', trans[key]); 
       } 
      } 

      return str; 
     } 
    }; 
}; 

function Language(){ 
    this.tbl_list = null; 

    this.append = function(string, obj, index){ 
     var row = $('<tr></tr>') 
      .append('<td class="list_row">'+js2txt(string)+'</td>'); 

     for(var key in obj){ 
      row.append('<td class="list_row">'+js2txt(obj[key])+'</td>'); 
     } 
     var td = $('<td class="list_row"></td>').appendTo(row); 
     //var inp_edit = $('<input type="button" value="'+Lang.get('BTN_EDIT')+'" />'); 
     alert(Lang.get); 
     List.append_row(row, this.tbl_list, index); 
    }; 
}; 
alert(Lang.get); 

语言对象Lang.get返回未定义的内部,但它外面返回功能!?

+0

没有足够的上下文来理解发生了什么。 – 2011-05-19 22:56:24

+0

你怎么知道'里面'和'外部'是什么? – Neal 2011-05-19 22:56:28

+0

是否存在变量范围问题?也许尝试将其指定为全局? 'var window.Lang = Lang;'(在函数之上),然后在函数中将它改为'window.Lang.get' – Jason 2011-05-19 22:57:24

回答

0
> var Lang = new function(){ 
>  this.get = function(str, trans){ 
>   if(TRANSLATE[str]){ 
>    var str = TRANSLATE[str][LANG]; 
>    if(count_obj(trans) > 0){ 
>     for(var key in trans){ 
>      str = str.replace('%'+key+'%', trans[key]); 
>     } 
>    } 
>    return str; 
>   } 
>  }; }; 

我没有看到使用新的上述原因,它只是浪费资源。由于Lang似乎不被称为构造函数,因此按照惯例,它应该以小写字母开头。为什么不:

var lang = { 
    get: function(str, trans) { 
     // function body 
    } 
}; 

> function Language(){ 
>  this.tbl_list = null; 
> 
>  this.append = function(string, obj, index){ 
>  /* snip */ 
>   alert(Lang.get); 
>  /* snip */ 
>  }; }; 


alert(Lang.get); // shows source of Lang.get 

语言对象Lang.get内部返回未定义,但外面它返回的功能!?

你怎么叫它?这似乎是一个构造函数,所以:

var x = new Language(); // Create instance lf Language 
x.append(); // Shows Lang.get 

这是相同的结果调用Language的功能。什么是问题?

另外,jQuery的东西,似乎是非常低效的。你可能想要解决这个问题。例如

> var row = $('<tr></tr>') 
>    .append('<td class="list_row">'+js2txt(string)+'</td>'); 

会好得多:

var row = $('<tr><td class="list_row">'+js2txt(string)+'</td></tr>'); 

甚至更​​好是创建一个单列你想要的结构,克隆它的每一行,那么只需更换单元格的内容。

1

我觉得这是你在哪里错了:

var Lang = new function(){ 

赋值给一个变量的函数时,不要使用new。这样做:

var Lang = function(){ 
+2

或者它是一个独立的,并应该是'无功郎=新(函数(){...});' – 2011-05-19 23:10:16

0

Language函数定义和初始化的var Lang初始化上方悬挂。在达到Lang的初始化程序之前是否有可能调用Language

+0

没有..郎首先被初始化..代码在同一个未来此处粘贴的订单 – clarkk 2011-05-19 23:14:55

+0

Lang.get在Language对象外部的警报完美返回功能 – clarkk 2011-05-19 23:15:43

+0

@clarkk。我并没有问最先初始化哪一个。语言首先被初始化。尝试运行'alert(f()); var x = 42;函数f(){return“x =”+ x; }'它会提醒'x = undefined'而不是报告错误,因为'f'被初始化,然后调用'f',然后初始化'x'。 – 2011-05-19 23:39:15