好了,現在開始函數這一章節,這之後就開始物件導向,加油吧,多看點。
4.1 內建的全域函數
javascript中內建了很多預定義的函數(也叫做全域函數或者頂級函數),用於處理常見的操作。可以看作是Global類的方法,並且常量Infinity和NaN可以看作是Global類的屬性,方法包括escape(), eval(), isFinite(), inNaN(),parseFloat(), parseInt(),Boolean(), Number(), String(), unescape(), encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent()。
值得一提的就是eval(), encodeURIComponent(), decodeURIComponent().。
eval():
var x3 = "good!";var x = 3;var y = eval("x"+x); //擷取變數x3,也即 y = x3;document.write(y); //輸出good!
encodeURIComponent():
在網上找了一篇文章,感覺還行escape()、encodeURI()、encodeURIComponent()區別詳解 裡面有相關代碼,也是W3school上範例,記憶中自己也寫過有關URL解析的代碼,結果後來找到了下面一段,感覺寫的不錯,用一個函數封裝好了,索性也就貼出來了。
//其實是解析url傳遞的參數的function analysisUrl(){ var vals =[]; var query= location.search.substring(1).split('&'); var i =0; var index; for(;i<query.length;i++){ index = query[i].indexOf("="); vals[i] = query[i].substring(index+1); }
var add = new Function("x","y","return x+y");//等價於function add(x,y){return x+y;}
return vals;}function loadData(){ var busData; var vals = analysisUrl(); console.log(vals.length); var customerId = vals[0]; //從這裡開始,就可以換成你所需的參數的名字 var startDate = vals[1]; var lastDate = vals[2];}
4.2 自訂函數
函數定義有三種方法:
1) 最常見的,也是推薦的--函數語句:
function myFunc(arg_1,arg_2){
//執行語句
}
2) 函數運算式定義函數(匿名函數)
var myfunc = function(arg_1,arg_2){
// 執行語句
}
3) 使用function類定義函數
var myFunc = new Function([arg1,arg2],functionBody);
前兩種函數定義方法的區別:
區別有很多呢,簡單的說就是推薦使用第一種,我在一個視頻教程上說第二種有嚴重的效能問題,不推薦。下面具體看一下吧。
1)用函數語句定義不管在定義之前還是之後都能被指令碼引用,簡單地說就是看下面代碼:
//函數語句,這樣是可以的myFunc();function myFunc(){}//函數運算式,這樣是不可以的myFunc();var myFunc = function(){}
2) 函數運算式作為另一些函數或方法的參數,這個不就是用匿名函數作為參數麼,隨便給段代碼吧:
$.ajax( { url : 'getSecondIdAction.action?t=' + new Date(), type : 'post', async : false, datatype : 'json', success : function(data) { //函數運算式 secondIdData = data; secondIdCombox = $('#secondId').combobox( { valueField : 'dptid', textField : 'dptname', data : secondIdData, onSelect : function(record) { //函數運算式 thirdIdCombox.combobox('clear'); changeThirdIdData(record.dptid); managerScoreQuery(record.dptid); } });
3) 如果記得在學習筆記1中的顯式釋放,記憶體回收機制的話,那在這邊函數運算式就可以這樣用。代碼就不貼了。
總結:如果沒有特殊用途,就使用函數語句吧,函數運算式就是用在使用一次後便丟棄的函數,這樣有利於記憶體管理(匿名函數不都是這樣用的麼)。還有就是像prototype屬性增益集函數以實現對象方法的定義,在物件導向編程中較多。
4.3 匿名自執行函數
函數是一個封閉的範圍範圍,並且可以嵌套函數,所以可以使用這種匿名自執行函數來實現封裝自己的所有函數和變數,從而避免來自多個開發人員的多個函數相互衝突。用到了閉包的原理,這個留待以後詳細解決吧,很重要的一個概念。
(function(){ //一些執行語句})();//添加參數(function(arg1,arg2){//一些執行語句})(arg1,arg2);//如果用過JQuery的話,肯定會對下面的代碼有印象的,就是用到了匿名函數自執行.$.document.ready(function(){ //一些執行語句});
在JQuery中用到了很多這樣的匿名自執行函數。其實學javascript也是因為Jquery。
var o = new Object();(function(obj){ obj.myFunc = function(){ //執行語句 }; var name = "13123"; obj.username = name;})(o);alert(o.username);alert(o.myFunc());
如果自己寫外掛程式的話,就將全域對象window作為參數傳進去。
慚愧,慚愧,我以為這一章結束了呢,結果。。。後面還有挺多東西的呢,那就下一章再寫吧。