原文:http://pouyang.javaeye.com/blog/576383
所有的過失在未犯以前,都已定下應處的懲罰
JavaScript中最好的特性就是它對函數的實現,它幾乎無所不能,但是,想必你也能
預料到,函數在JavaScript里也并非萬能藥。
函數包含一組語句,它們是JavaScript的基礎模塊單元,用于代碼復用,信息隱藏和組合調用函數用語指定對象的行為,一般來說,所謂編程就是將一組需求分解成一組
函數與函數結構的技能。
函數字面量
函數對象可以通過函數字面量來創建
每個函數對象在創建時也附帶有一個prototype屬性,它的值是一個擁有
constructor屬性且值即為該函數的對象
調用運算符是跟在任何產生一個函數值的表達式之后的一對圓括號。圓括號內可包含零個或
多個用逗號隔開的表達式,每個表達式產生一個參數值,每個參數值被賦予函數聲明時定義的
形式參數名。當實際參數(arguments)的個數與形式參數(parameters)的個數不匹配時不會導致
運行時錯誤。如果實際參數值過多了,超出的參數值將被忽略。如果實際參數值過少,缺失的值將會被替換為
undefined。對參數值不會進行類型檢查,任何類型的值得都可以被傳遞給參數。
new 前綴調用的函數被稱為構造器函數。按照約定,它們保存在以大寫格式命名的變量里。
參數
當函數被調用時,會得到一個免費的奉送的參數,那就是arguments數組,通過它函數可以訪問所有它被調用時傳遞給它的參數列表,包括那些沒有分配給函數聲明定義的形式參數的多余參數這就使得編寫一個無須指定參數個數的函數成為可能
因為語言的一個設計錯誤,arguments并不是一個真正的數組。它只是一個“類似數組”的對象。 arguments擁有一個length屬性,但它缺少所有數組方法。
函數返回值
一個函數總是會返回一個值。如果沒有指定返回值,則返回"undefined".
如果函數以在前面加上new前綴的方式來調用,且返回不是一個對象
則返回this( 該新對象)
??????
函數異常
JavaScript提供一套異常處理機制
如果在try代碼塊內拋出一個異常,控制權就會跳轉到它的catch從句
一個try語句代碼塊只會有一個將捕獲所有異常的catch代碼塊。如果你的處理手段
取決于異常類型,那么異常處理器必須檢查異常對象的name屬性以確定異常的類型。
閉包
注意最后一行(常常看到別人的代碼),我們并沒有把一個函數賦值給myObject,我們是把調用該函數后返回的結果賦值給它。注意作后一行();該函數返回一個包含兩個方法的對象,并且這些方法繼承享有訪問value變量的特權。
這個quo函數被設計成無須在前面加上new來使用,所以名字也沒有首字母大寫,
當我們調用quo時,它返回包含get_status方法的一個新對象,該對象的一個引用保存在myQuo中,
即使quo已經返回了,但get_status方法仍然享有訪問quo對象的status屬性的特權。get_status方法并不是
訪問該參數的一個拷貝,它訪問的就是該參數本身,這是可能因為該函數可以訪問
它被創建時所處的上下文環境。這就被稱為閉包。
回調
模塊
級聯
套用
記憶
所有的過失在未犯以前,都已定下應處的懲罰
JavaScript中最好的特性就是它對函數的實現,它幾乎無所不能,但是,想必你也能
預料到,函數在JavaScript里也并非萬能藥。
函數包含一組語句,它們是JavaScript的基礎模塊單元,用于代碼復用,信息隱藏和組合調用函數用語指定對象的行為,一般來說,所謂編程就是將一組需求分解成一組
函數與函數結構的技能。
函數字面量
函數對象可以通過函數字面量來創建
- var ?add?=? function ?(a,b)?{ ??
- ???? return ?a?+?b; ??
- } ??
- ??
- var ?myObject?=?{ ??
- ????value:0; ??
- ????increment: function (inc)?{ ??
- ???????? this .value?+=? typeof ?inc?==? 'number' ???inc?:?1; ??
- ????} ??
- } ??
- myObject.increment(); ??
- document.writeln(myObject.value);? //1 ??
- ??
- myObject.increment(2); ??
- document.writeln(myObject.vale);? //?3 ??
var add = function (a,b) { return a + b; } var myObject = { value:0; increment:function(inc) { this.value += typeof inc == 'number' ? inc : 1; } } myObject.increment(); document.writeln(myObject.value); //1 myObject.increment(2); document.writeln(myObject.vale); // 3
每個函數對象在創建時也附帶有一個prototype屬性,它的值是一個擁有
constructor屬性且值即為該函數的對象
調用運算符是跟在任何產生一個函數值的表達式之后的一對圓括號。圓括號內可包含零個或
多個用逗號隔開的表達式,每個表達式產生一個參數值,每個參數值被賦予函數聲明時定義的
形式參數名。當實際參數(arguments)的個數與形式參數(parameters)的個數不匹配時不會導致
運行時錯誤。如果實際參數值過多了,超出的參數值將被忽略。如果實際參數值過少,缺失的值將會被替換為
undefined。對參數值不會進行類型檢查,任何類型的值得都可以被傳遞給參數。
new 前綴調用的函數被稱為構造器函數。按照約定,它們保存在以大寫格式命名的變量里。
參數
當函數被調用時,會得到一個免費的奉送的參數,那就是arguments數組,通過它函數可以訪問所有它被調用時傳遞給它的參數列表,包括那些沒有分配給函數聲明定義的形式參數的多余參數這就使得編寫一個無須指定參數個數的函數成為可能
- <script?language= "javascript" ?type= "text/javascript" > ??
- ????? var ?sum??=? function (){ ??
- ???????? var ?i?,sum?=0; ??
- ???????? for ?(i?=?0;?i?<?arguments.length;i++)?{ ??
- ????????????sum?+=?arguments[i]; ??
- ????????} ??
- ???????? return ?sum; ??
- ????}; ??
- ?alert(sum(12,8)); //?20 ??
<script language="javascript" type="text/javascript"> var sum = function(){ var i ,sum =0; for (i = 0; i < arguments.length;i++) { sum += arguments[i]; } return sum; }; alert(sum(12,8));// 20
因為語言的一個設計錯誤,arguments并不是一個真正的數組。它只是一個“類似數組”的對象。 arguments擁有一個length屬性,但它缺少所有數組方法。
函數返回值
一個函數總是會返回一個值。如果沒有指定返回值,則返回"undefined".
如果函數以在前面加上new前綴的方式來調用,且返回不是一個對象
則返回this( 該新對象)
??????
- ? function ?a()?{ ??
- ??document.writeln( "a" ); ??
- } ??
- ??
- alert(a());? //?undefined ??
- alert( new ?a());? //[object?Object] ??
- ??
- ??
- ? var ?bb?=? function ?a?()?{ ??
- ????????alert( "bb" ); ??
- ??}();?? //?注意()alert("bb"); ??
- ??
- ?? function ?a()?{ ??
- ????alert( "bb" ); ??
- ??}();??? //?錯誤 ??
function a() { document.writeln("a"); } alert(a()); // undefined alert(new a()); //[object Object] var bb = function a () { alert("bb"); }(); // 注意()alert("bb"); function a() { alert("bb"); }(); // 錯誤
函數異常
JavaScript提供一套異常處理機制
- <script???language="javascript"??type="text/javascript"> ??
- var?add?=?function(a,b)?{ ??
- ???if?(typeof?a?!=?'number'||?typeof?b!=?'number')?{ ??
- ????????throw?{ ??
- ????????????name?:'TypeError', ??
- ????????????message:'add?needs?numbers'??
- ????????}; ??
- ????????return?a+?b; ??
- ???} ??
- } ??
- var??try_it?=?function?()?{ ??
- ?try?{ ??
- ????add('seven'); ??
- ?}catch?(e)?{ ??
- ????document.writeln(e.name+':'+e.message) ??
- ?} ??
- }? ??
- try_it();?//?add?needs?number ??
- </script>??
<script language="javascript" type="text/javascript"> var add = function(a,b) { if (typeof a != 'number'|| typeof b!= 'number') { throw { name :'TypeError', message:'add needs numbers' }; return a+ b; } } var try_it = function () { try { add('seven'); }catch (e) { document.writeln(e.name+':'+e.message) } } try_it(); // add needs number </script>
如果在try代碼塊內拋出一個異常,控制權就會跳轉到它的catch從句
一個try語句代碼塊只會有一個將捕獲所有異常的catch代碼塊。如果你的處理手段
取決于異常類型,那么異常處理器必須檢查異常對象的name屬性以確定異常的類型。
閉包
- var?myObject?=?function?()?{ ??
- ????var?value?=?0; ??
- ????return?{ ??
- ????????increment:function?(inc)?{ ??
- ????????????value?+=?typeof?inc?=='number'?inc:1; ??
- ????????}, ??
- ????????getValue:function?()?{ ??
- ????????????return?value; ??
- ????????} ??
- ????} ??
- }();//?注意這里??
var myObject = function () { var value = 0; return { increment:function (inc) { value += typeof inc =='number'?inc:1; }, getValue:function () { return value; } } }();// 注意這里
注意最后一行(常常看到別人的代碼),我們并沒有把一個函數賦值給myObject,我們是把調用該函數后返回的結果賦值給它。注意作后一行();該函數返回一個包含兩個方法的對象,并且這些方法繼承享有訪問value變量的特權。
- var?quo?=?function?(status)?{ ??
- ????return?{ ??
- ????????get_status:function?()?{ ??
- ????????????return?status; ??
- ????????} ??
- ????}; ??
- } ??
- var?myQuo?=?quo?("amazed")?; ??
- alert(myQuo.get_status());//amazed??
var quo = function (status) { return { get_status:function () { return status; } }; } var myQuo = quo ("amazed") ; alert(myQuo.get_status());//amazed
這個quo函數被設計成無須在前面加上new來使用,所以名字也沒有首字母大寫,
當我們調用quo時,它返回包含get_status方法的一個新對象,該對象的一個引用保存在myQuo中,
即使quo已經返回了,但get_status方法仍然享有訪問quo對象的status屬性的特權。get_status方法并不是
訪問該參數的一個拷貝,它訪問的就是該參數本身,這是可能因為該函數可以訪問
它被創建時所處的上下文環境。這就被稱為閉包。
回調
模塊
級聯
套用
記憶