2010-03-24 75 views
-1

簡而言之,我想使用對象字面值來允許我以任何順序將未知量的變量傳遞給函數。雖然這在理論上不是什麼大問題,但在我的代碼中,這個對象字面量被傳遞給第二個函數on_change使用字符串和eval以及多種函數和各種函數傳遞未知數量的變量

on_change通過將元素的innerHTML與字符串進行比較來工作;如果相同,則設置超時再次調用該函數。如果元素的innerHTML與字符串不同,則執行第三個參數,它可以是函數或字符串。它將以任何方式執行。我已經測試了這個功能,並且使用了一段時間。

不過,我似乎無法獲取對象字面通過函數調用流...

var params = { xpos:'false'}; 
on_change('window_3_cont_buffer','',' 
if(Window_manager.windows[3].window_cont_buffer.getElementsByTagName(\'content\')[0].getElementsByTagName(\'p\')[0].innerHTML == \'ERROR\'){ 
alert(Window_manager.windows[3].window_cont_buffer.getElementsByTagName(\'content\')[0].getElementsByTagName(\'p\')[1].innerHTML); 
return false; 
} else { 
Window_manager.windows[3].load_xml(\'location/view.php?location_ID=3\', \'\', ' + params + '); } 
'); 

我把這個作爲表單提交的一部分。在這一行之後,我然後調用一個函數來通過ajax加載一些內容,它工作正常,並且會觸發on_change函數中的代碼。

我測試了load_xml函數,它能夠調用alert(param.xpos)並得到正確的響應。我甚至可以在未定義的支票中添加,以便我撥打電話load_xml的其餘時間不會被警報淹沒。

load_xml函數首先設置on_change函數,然後調用函數將內容加載到隱藏的div。一旦AJAX請求更新了DIV,on_change函數現在應該調用parse_xml函數。這將從xml文件中提取信息。但是......這個對象字面參數的概念是它可以告訴這個函數忽略某些東西。

on_change("window_" + this.id + "_cont_buffer", "", "Window_manager.windows[" + this.id + "].parse_xml('" + param + "')"); 

這是load_xml一部分,它工作完全正常,即使在有帕拉姆位。除了parse_xml似乎無法使用該參數。

我已經能夠得到它的一個點,parse_xml可以alert(param),給[object object]思想,我會意味着字面對象已經通過,但是當我嘗試並調用alert(param.xpos)我得到了一個未定義。

我知道這是一個問題的豬,我可以通過讓函數花費數十億布爾參數來解決它,但它不是一個很好的解決方案。

回答

2

實際上,你這是什麼:

var params = {param: "value"}; 
foo("bar('one', 'two', 'three');"); 

...其中foo對字符串使用eval,是這樣的:

function foo(codestring) { 
    eval(codestring); 
} 

...你正在尋找如何在其中嵌入params

可能通過將對象字面量序列化爲字符串來完成此操作,以便當您將其與另一個字符串合併並計算總字符串時,將對其進行評估。瀏覽器是慢慢變JSON序列化建,但現在你想使用jQuery,原型,或者(如果你只是想這個部分)json2.js from Crockford,用於關可以變成JSON字符串成JSON字符串對象提供JSON.stringify。所以:

var params = {param: "value"}; 
foo("bar(" + JSON.stringify(params) + ");"); 

但你真的想要做的就是重構,使所有的邏輯都表示爲代碼,在字符串中沒有代碼。然後,你可以直接通過文字,加上其他福利,包括模塊化,調試的整體筏等

var params = {param: "value"}; 
function callBar() { 
    bar(params); 
} 
foo(callBar); 

...改變foo,使其調用一個函數,而不是eval荷蘭國際集團的字符串。 (eval是避免到只要有可能,並套用達賴喇嘛,這是[幾乎]總是可能的。)我的樣品foo變化:

function foo(func) { 
    func(); 
} 

如果foo需要包括更多的信息,bar(如果callBar設置爲處理這些額外的參數),它可以使用Function#callFunction#apply做到這一點。 (這些鏈接是MDC,不過不用擔心,他們不是火狐特有的,他們一直在ECMA規範多年,幾乎普遍支持。)

1

你不能把對象內一個字符串。你將不得不序列化對象,將其添加到字符串,然後解析它放回在另一側的結構化對象。要做到這一點最簡單的方法是使用JSON(通過JSON.stringify或後備庫爲那些沒有它舊的瀏覽器),因爲JSON計算爲簡單的JavaScript。

注意,你不會得到完全相同的對象回來,但一個新的具有相同屬性和屬性,它僅適用於簡單類型,所以你不能包括的對象或任何功能。

然而,在任何情況下,圍繞傳遞JavaScript代碼串要極力避免抗圖案。相反,使用內聯函數,你不必擔心你,不能把什麼一個字符串,你可以擺脫所有的不可讀的包裝和\ -escaping:

var params = {xpos: 'false'}; 
on_change('window_3_cont_buffer', '', function() { 
    var w= Window_manager.windows[3]; 
    var ps= w.window_cont_buffer.getElementsByTagName('content')[0].getElementsByTagName('p'); 
    if (ps[0].innerHTML==='ERROR') { 
     alert(ps[1].innerHTML); 
     return false; 
    } else { 
     w.load_xml('location/view.php?location_ID=3', '', params); 
    } 
}); 
+0

不可否認的內聯函數是什麼,我從未想過關於......即使我去確保on_change可以處理功能的努力。 這應該意味着,當我通過PARAMS(這我甚至可以只是把直接在的地方)應該拿起因爲它是。 謝謝! – thecoshman 2010-03-24 12:55:26

0

一些一般技術可能對你會有所幫助:

// Example of calling function objects given as arguments: 

function on_change(foo, callback1, callback2) { 
    if (foo) 
     callback1(); 
    else 
     callback2.call(available_as_this); 
} 

on_change(foo, function() { your code }, function() { another code }); 


// Example of function taking arbitrary number of arguments: 

function any_params() { 
    console.log('I got ' + arguments.length + 'arguments!'); 
    console.log('First argument: ' + arguments[0]); 
} 

any_params('one', 'two', 'three', [], null, {}); 

arguments變量和call()

0

我想使用對象字面量來允許我以任意順序將任意數量的變量傳遞給函數。

爲什麼哦爲什麼你不創建一個包含參數和函數的對象,並傳遞它呢?接收函數可以在嘗試使用它之前測試是否設置了對象的屬性。