2011-05-19 124 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