<strong>一.通過關鍵字 function 定義</strong>
1.函數可以通過聲明定義,也可以是一個表達式。
1)聲明:
function functionName(parameters) {
執行的代碼
}
注意:
a.由于函數聲明不是一個可執行語句,所以不以分號結束。
2)表達式:
函數表達式可以存儲在變量中:
var x = function (a, b) {return a * b};
在函數表達式存儲在變量后,變量也可作為一個函數使用:
var z = x(4, 3);
注意:
a.以上函數實際上是一個 匿名函數 (函數沒有名稱)。
b.函數存儲在變量中,不需要函數名稱,通常通過變量名來調用。
c.上述函數以分號結尾,因為它是一個執行語句。
<strong>二.通過內置的 JavaScript 函數構造器(Function())定義</strong>
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
等價于:
var myFunction = function (a, b) {return a * b}
var x = myFunction(4, 3);
注意:
在 JavaScript 中,很多時候,你需要避免使用 new 關鍵字。
<strong>三.函數提升(Hoisting)</strong>
提升(Hoisting)應用在變量的聲明與函數的聲明。使變量和函數可以在聲明之前調用。
注意:
聲明方式的函數可以提升,使用表達式定義函數時無法提升。
<strong>四.自調用函數</strong>
(function () {
var x = "Hello!!";
})();
或:
(function(){
var x = "World!!";
}());
注意:
a.想避免因少寫一個分號而拋出TypeError: undefined is not a function異常,那么就像下面的那樣寫吧!
;(function(){
console.log('HI');
}());
b.以上函數實際上是一個 匿名自我調用的函數 (沒有函數名)。
c首先要牢記一條規則:括號會馬上執行其前面的表達式。
var i=function (a,b){
return a+b;
}(1,2);
alert(i);
<strong>五.函數是對象</strong>
1.在JavaScript解釋執行的時候,實際上每個函數都是被維護為一個對象,即函數對象(Function Object)。
2.函數對象與其它用戶所定義的對象有著本質的區別,這一類對象被稱之為內部對象,例如日期對象(Date)、數組對象(Array)、字符串對象(String)都是屬于內部對象。換句話說,這些內置對象的構造器是由JavaScript本身所定義的:通過執行new Array()這樣的語句返回一個對象,JavaScript 內部有一套機制來初始化返回的對象,而不是由用戶來指定對象的構造方式。
3.在 JavaScript中,函數對象對應的類型是Function,正如數組對象對應的類型是Array,日期對象對應的類型是Date一樣,可以通過new Function()來創建一個函數對象,也可以通過function關鍵字來創建一個對象。
4.為了便于理解,將函數對象的創建和數組對象的創建來比較。先看數組對象:下面兩行代碼的作用是一樣的,都是創建一個數組對象:
var myArray=[];
等價于
var myArray=new Array();
同樣,下面的兩段代碼也是等價的,都是創建一個函數:
function myFunction(a,b){
return a+b;
}
等價于
var myFunction=new Function("a","b","return a+b");
<strong>六.函數參數</strong>
1.顯示參數Parameters
函數顯式參數在函數定義時列出。
functionName(parameter1, parameter2, parameter3) {
// 要執行的代碼……
}
2.隱式參數Arguments
函數隱式參數在函數調用時傳遞給函數真正的值。
function funTest(a,b){
for(var i in argument){
console.log(argument[i]);
}
}
funTest(1,2,3,'4','5',true,6);//前兩個是顯示參數,其他都是隱式參數
3.理解說明:
javascript函數的參數與大多數其他語言的函數的參數有所不同。函數不介意傳遞進來多少個參數,也不在乎傳進來的參數是什么數據類型,甚至可以不傳參數。
<strong>七.函數調用</strong>
1.函數作為一個函數調用
function myFunction(a, b) {
return a * b;
}
myFunction(10, 2); // 直接調用函數,返回20;
注意:
a.在瀏覽器中的頁面對象是瀏覽器窗口(window 對象)。以上函數會自動變為 window 對象的函數。myFunction() 和 window.myFunction() 是一樣的:
function myFunction(a, b) {
return a * b;
}
window.myFunction(10, 2);//這是調用 JavaScript 函數常用的方法, 但不是良好的編程習慣,全局變量,方法或函數容易造成命名沖突的bug。
b.函數作為全局對象調用,會使 this 的值成為全局對象。使用 window 對象作為一個變量容易造成程序崩潰。
function myFunction() {
return this;
}
myFunction(); //f返回是"[object Window]"
2.函數作為一個方法調用
在 JavaScript 中你可以將函數定義為對象的方法。
以下實例創建了一個對象 (myObject), 對象有兩個屬性 (firstName 和 lastName), 及一個方法 (fullName):
var myObject = {
firstName:"W",
lastName: "ZL",
fullName: function () {
return this.firstName + " " + this.lastName;
},
other: function(){
return this;
}
}
myObject.fullName(); // 返回"WZL"
myObject.other(); // 返回"[object Object]"
注意:
a.fullName 方法是一個函數。函數屬于對象。
b.this對象,擁有 JavaScript 代碼。實例中 this 的值為 myObject 對象。
3.使用構造函數調用函數 // 略掉
4.使用函數方法調用函數
在 JavaScript 中, 函數是對象。JavaScript 函數有它的屬性和方法。
call() 和 apply() 是預定義的函數方法。 兩個方法可用于調用函數,兩個方法的第一個參數必須是對象本身。
實例:
var myObject;
var myArray = [10,2];
function myFunction(a, b) {
return a * b;
}
myObject = myFunction.call(myObject, 10, 2);
myObject = myFunction.apply(myObject, myArray);
<strong>八.函數閉包</strong>
1.JavaScript 變量可以是局部變量或全局變量。私有變量可以用到閉包。
2.在web頁面中全局變量屬于 window 對象。
3.變量聲明時如果不使用 var 關鍵字,那么它就是一個全局變量,即便它在函數內定義。
4.內嵌函數
5.函數閉包
var add = (function () {
var counter = 0;
return function() {return counter += 1;}
})();