javascript
JavaScript基础5——关于ECMAscript的函数
- ECMAScript的函數概述(一般定義到<head>標簽之間)
(1)定義函數,JavaScript一般有三種定義函數方法:
*第一種是使用function語句定義函數(靜態方法)
第二種是使用Function()構造函數來定義函數(不常用)
?
*第三種是在表達式中定義函數
?
(2)函數作用域:
?????? 函數外面定義的變量是全局變量,在整個HTML頁面內都有效(生存期在整個HTML頁面)。,函數內可以直接使用。在函數內部沒有使用var定義的,變量則為全局變量,*在函數內使用var關鍵字定義的變量是局部變量,即出了函數外邊無法獲取。js函數定義的參數沒有默認值。(目前只有最新的火狐瀏覽器支持)
?
(3)如何調用函數:
//sayHi函數 function sayHi(sName, sMessage) {alert("Hello " + sName + sMessage);}//調用上面的函數 sayHi(),會生成一個警告窗口 sayHi("David", " Nice to meet you!")?
(4)函數如何返回值:
函數 sayHi() 未返回值,即使函數確實有值,也不必明確地聲明它。該函數只需要使用 return 運算符后跟要返回的值即可。
1 function sum(iNum1, iNum2) { 2 3 return iNum1 + iNum2; 4 5 } 6 7 //下面的代碼把 sum 函數返回的值賦予一個變量: 8 9 var iResult = sum(1,1); 10 11 alert(iResult); //輸出 "2"另一個重要概念是,與在 Java 中一樣,函數在執行過 return 語句后立即停止代碼。因此,return 語句后的代碼都不會被執行。
1 function sum(iNum1, iNum2) { 2 3 return iNum1 + iNum2; 4 //alert 窗口就不會顯示出來 5 alert(iNum1 + iNum2); 6 7 }一個函數中可以有多個 return 語句,如下所示:
1 function diff(iNum1, iNum2) { 2 3 if (iNum1 > iNum2) { 4 5 return iNum1 - iNum2; 6 7 } else { 8 9 return iNum2 - iNum1; 10 11 } 12 13 }上面的函數用于返回兩個數的差。要實現這一點,必須用較大的數減去較小的數,因此用 if 語句決定執行哪個 return 語句。
如果函數無返回值,那么可以調用沒有參數的 return 運算符,隨時退出函數。
1 function sayHi(sMessage) { 2 if (sMessage == "bye") { 3 4 return; 5 6 } 7 8 alert(sMessage); 9 10 } 11 //這段代碼中,如果 sMessage 等于 "bye",就永遠不顯示警告框 12 13 //注釋:如果函數無明確的返回值,或調用了沒有參數的 return 語句,那么它真正返回的值是 undefined。?
-
關于函數的arguments對象
在函數代碼中,使用特殊對象 arguments,開發者無需明確指出參數名,就能訪問它們。
例如,在函數 sayHi() 中,第一個參數是 message。用 arguments[0] 也可以訪問這個值,即第一個參數的值(第一個參數位于位置 0,第二個參數位于位置 1,依此類推)。
因此,無需明確命名參數,就可以重寫函數:
1 function sayHi() { 2 if (arguments[0] == "bye") { 3 return; 4 } 5 alert(arguments[0]); 6 }1.檢測參數個數
??????? 還可以用 arguments 對象檢測函數的參數個數,引用屬性 arguments.length 即可。下面的代碼將輸出每次調用函數使用的參數個數:
1 function howManyArgs() { 2 3 alert(arguments.length); 4 5 } 6 7 howManyArgs("string", 45); 8 howManyArgs(); 9 howManyArgs(12); 10 11 //上面這段代碼將依次顯示 "2"、"0" 和 "1"。 12 //與其他程序設計語言不同,ECMAScript 不會驗證傳遞給函數的參數個數是否等于函數定義的參數個數。開發者定義的函數都可以接受任意個數的參數(根據 Netscape 的文檔,最多可接受 25 個),而不會引發任何錯誤。任何遺漏的參數都會以 undefined 傳遞給函數,多余的函數將忽略。?
2.模擬函數重載
用 arguments 對象判斷傳遞給函數的參數個數,即可模擬函數重載:
1 function doAdd() { 2 3 if(arguments.length == 1) { 4 5 alert(arguments[0] + 5); 6 7 } else if(arguments.length == 2) { 8 9 alert(arguments[0] + arguments[1]); 10 11 } 12 } 13 doAdd(10); //輸出 "15" 14 15 doAdd(40, 20); //輸出 "60" 16 17 //當只有一個參數時,doAdd() 函數給參數加 5。如果有兩個參數,則會把兩個參數相加,返回它們的和。所以,doAdd(10) 輸出的是 "15",而 doAdd(40, 20) 輸出的是 "60"。雖然不如重載那么好,不過已足以避開 ECMAScript 的這種限制。-
Function對象(類)
1. Function對象的使用
函數實際上是功能完整的對象。Function 類可以表示開發者定義的任何函數。用 Function 類直接創建函數的語法如下:var function_name = new function(arg1, arg2, ..., argN, function_body)。
1 <html> 2 3 <head> 4 5 <script type="text/javascript"> 6 7 var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);"); 8 9 </script> 10 11 </head> 12 13 14 <body> 15 16 <script type="text/javascript" > 17 18 sayHi("Jackie","Welcome here!");//調用函數 19 20 </script> 21 22 </body> 23 24 </html>盡管可以使用 Function 構造函數創建函數,但最好不要使用它,因為用它定義函數比用傳統方式要慢得多。不過,所有函數都應看作 Function 類的實例。
2. 使用Function類的length屬性
1 <html> 2 3 <head> 4 5 <script type="text/javascript"> 6 7 function fun1(){} 8 9 function fun2(a1,a2){} 10 11 function fun3(a1,a2,a3,a4,a5,a6,a7){} 12 13 </script> 14 15 </head> 16 17 18 <body> 19 20 <script type="text/javascript"> 21 22 document.write(fun1.length+" "+fun2.length+" "+fun3.length); 23 24 </script> 25 26 </body> 27 28 </html>使用Function的length屬性可以得到函數的形參個數。
3. 使用Function類的valueOf()方法和toString()方法。這兩個方法返回的都是函數的源代碼,在調試時尤其有用。
?
1 <html> 2 3 <head> 4 5 function fun() { 6 7 alert("Hi"); 8 9 } 10 11 </head> 12 13 <body> 14 15 <script type="text/javascript"> 16 17 document.write(fun.toString());//輸出函數的源代碼 18 19 </script> 20 21 </body> 22 23 </html>-
閉包
ECMAScript 最易讓人誤解的一點是,它支持閉包(closure)。閉包,指的是詞法表示包括不被計算的變量的函數,也就是說,函數可以使用函數之外定義的變量。
1.簡單的閉包實例
在 ECMAScript 中使用全局變量是一個簡單的閉包實例。請思考下面這段代碼:
?
1 var sMessage = "hello world"; 2 3 function sayHelloWorld() { 4 5 alert(sMessage);//使用函數之外定義的變量 6 7 } 8 9 sayHelloWorld();?
在上面這段代碼中,腳本被載入內存后,并沒有為函數 sayHelloWorld() 計算變量 sMessage 的值。該函數捕獲 sMessage 的值只是為了以后的使用,也就是說,解釋程序知道在調用該函數時要檢查 sMessage 的值。sMessage 將在函數調用 sayHelloWorld() 時(最后一行)被賦值,顯示消息 "hello world"。
2.復雜的閉包實例
在一個函數中定義另一個會使閉包變得更加復雜。例如:
?
1 var iBaseNum = 10; 2 3 function addNum(iNum1, iNum2) { 4 5 function doAdd() { 6 7 return iNum1 + iNum2 + iBaseNum; 8 9 } 10 11 return doAdd(); 12 13 }?
這里,函數 addNum() 包括函數 doAdd() (閉包)。內部函數是一個閉包,因為它將獲取外部函數的參數 iNum1 和 iNum2 以及全局變量 iBaseNum 的值。 addNum() 的最后一步調用了 doAdd(),把兩個參數和全局變量相加,并返回它們的和。
這里要掌握的重要概念是,doAdd() 函數根本不接受參數,它使用的值是從執行環境中獲取的。可以看到,閉包是 ECMAScript 中非常強大多用的一部分,可用于執行復雜的計算。
提示:就像使用任何高級函數一樣,使用閉包要小心,因為它們可能會變得非常復雜。
-
JavaScript函數的思維導圖
轉載于:https://www.cnblogs.com/Jackie0714/p/4944041.html
總結
以上是生活随笔為你收集整理的JavaScript基础5——关于ECMAscript的函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swift inheritace 继承
- 下一篇: 将JSON转成DataSet(DataT