經常在外部JavaScript文件中分配響應函數,比如:
1 window.onload=function(){ 2 //... 3 }
有些時候響應函數是有參數的:
<input type="button" onclick="ClickResp('hello world'')" />
這種情況要怎么在外部JavaScript實現?
這里面涉及兩個問題:
1. 匿名函數的傳參問題。比如 var func=function(){}; 的情況,這里根本不允許實參的出現,因為只是定義而不是調用。
2. 怎么把數據從HTML傳給所鏈接的外部JavaScript文件?比如上面的例子中的'hello world'怎么傳給JavaScript處理?這個例子可以用value="hello world"來解決,但是如果有多個參數呢?
第一個問題可以用JavaScript一個經典特性來解決——閉包。
以 var func=function(){}; 為例,第一個問題的前提是實參已經在func的域或空間里面了,即使數據需要從HTML獲得,這個問題只是考慮數據到達JavaScript處理的空間之后的事情。因此,這個問題跟第二個問題之間是獨立的。
已知閉包使得內層函數能夠共享外層函數的域,因此可以確定閉包能夠解決:
1 var arg_handler = function(arg){ 2 alert(arg); 3 }; 4 5 var real_arg="hello world"; 6 var arg_wrapper=function(){ 7 return arg_handler(real_arg); 8 } 9 10 window.onload=arg_wrapper;
第二個問題可以用HTML5的data-*屬性來解決。前面已經說過可以用value來傳參,現在可以改為用自定義屬性來傳參,就沒有參數個數的限制問題了:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script> 5 window.onload=function(){ 6 var foo=document.getElementById('data').getAttribute('data-foo'); 7 var bar=document.getElementById('data').getAttribute('data-bar'); 8 var wrapper=function(){ 9 alert(handler(foo, bar)); 10 }; 11 var handler=function(x, y){ 12 return x+y; 13 }; 14 document.getElementById('data').onclick=wrapper; 15 }; 16 </script> 17 </head> 18 <body> 19 <input type="button" data-foo="foo" data-bar="bar" value="click" id="data" /> 20 </body> 21 </html>
寫這段示例代碼的時候出現了一個新問題,在另一篇隨筆中記錄。