標籤:ajax javascript
要想用匿名函數來實現使用者是否存在,就應該明白:什麼是匿名函數?是幹什麼的?怎麼用?結合Ajax如何??那麼就帶著疑問進入研究中:
一、是什嗎?
“匿名”根據字面意思理解就是沒有名字的意思。如果你能理解到這那麼你就對匿名函數有了一半的理解,即:匿名函數就是沒有實際名字,也沒有指標的函數。如:
(function(){//這裡忽略所有實現})();
通過這個簡單的匿名函數,我們來剖析它是怎麼顯現執行的?那麼出現在眼前最多的就是“()”,對的就是“()”在作怪。小括弧能把我們的運算式組合分塊,並且每一塊,也就是每一對小括弧,都有一個返回值。這個返回值實際上也就是小括弧中運算式的返回值。所以當我們用一對小括弧把匿名函數括起來的時候,實際上小括弧對返回的就是一個匿名函數的Function對象。因此,小括弧對加上匿名函數就如同有名字的函數般被我們取得它的引用位置了。所以如果在這個引用變數後面再加上參數列表,就會實現普通函數的調用形式。
二、幹什嗎?
那麼它是用來解決什麼問題的呢?這樣寫的目的是什嗎?由於JavaScript並不是物件導向的,所以它不支援封裝。但是在不支援封裝的語言裡同樣可以實現封裝,而實現的方法就是匿名函數。可見它的目的就是為封裝而生。
是否記得《Javascript的一種模組模式》中的第一句話就是“全域變數是魔鬼”。配合var關鍵字,匿名函數可以有效保證在頁面上寫入Javascript,而不會造成全域變數的汙染。這在給一個不是很熟悉的頁面增加Javascript時非常有效,也很優美。
三、怎麼用?
還記得上一篇部落格嗎?用Ajax來實現判斷使用者是否存在?那裡用了回調的方法來得到Ajax引擎返回的資料,那麼現在我們就用匿名函數的方法來實現同樣的操作(這裡只看JS的代碼部分,其它不變):
function validate(field){if (trim(document.getElementById("userId").value).length != 0) {var xmlHttp = null;//表示當前瀏覽器不是ie,如ns,firefoxif(window.XMLHttpRequest) {xmlHttp = new XMLHttpRequest();} else if (window.ActiveXObject) {xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");}//解決緩衝方法,用毫秒來加時間戳記var url="user_validate.jsp?userId=" + trim(document.getElementById("userId").value)+ "&time=" +new Date().getTime();//佈建要求方式用GET,佈建要求的URL,設定非同步提交xmlHttp.open("GET",url,true);//將方法地址複製給onreadystatechange屬性//類似於電話號碼,這裡採用了匿名函數的方法來實現回調功能xmlHttp.onreadystatechange=function(){//Ajax引擎狀態為成功if(xmlHttp.readyState ==4){//http協議狀態為成功if(xmlHttp.status ==200){//alert("請求成功!")//判斷如果為空白,將紅字span去掉if (trim(xmlHttp.responseText) != ""){document.getElementById("spanUserId").innerHTML = "<font color='red'>" + xmlHttp.responseText + "</font>"}else{document.getElementById("spanUserId").innerHTML = "";}}else{alert("請求失敗,錯誤碼=" +xmlHttp.status);}}}//將設定的資訊發送到Ajax引擎xmlHttp.send(null);}else{document.getElementById("spanUserId").innerHTML = "";}}
當然匿名函數的實現方法還有很多種,在這裡就不一一例舉了,希望在今後的學習中得到更多的實踐。
四、對比
通過對比兩種Ajax對判斷使用者是否存在的實現,我們可以看出採用匿名函數可以將之前的三個函數整理成一個函數,這樣的實現更加簡單,並且可以提高效率。
五、總結
通過對匿名函數的學習,讓我明白了每個知識點之間都有千絲萬縷的聯絡。所以在今後的學習中不要放過任何不明白,不懂的名詞。
Ajax實踐之匿名函數判斷使用者是否存在