<strong>一.通過關(guān)鍵字 function 定義</strong>
1.函數(shù)可以通過聲明定義府阀,也可以是一個(gè)表達(dá)式灼芭。
1)聲明:
function functionName(parameters) {
執(zhí)行的代碼
}
注意:
a.由于函數(shù)聲明不是一個(gè)可執(zhí)行語句,所以不以分號(hào)結(jié)束区端。
2)表達(dá)式:
函數(shù)表達(dá)式可以存儲(chǔ)在變量中:
var x = function (a, b) {return a * b};
在函數(shù)表達(dá)式存儲(chǔ)在變量后沈善,變量也可作為一個(gè)函數(shù)使用:
var z = x(4, 3);
注意:
a.以上函數(shù)實(shí)際上是一個(gè) 匿名函數(shù) (函數(shù)沒有名稱)。
b.函數(shù)存儲(chǔ)在變量中炼绘,不需要函數(shù)名稱嗅战,通常通過變量名來調(diào)用。
c.上述函數(shù)以分號(hào)結(jié)尾俺亮,因?yàn)樗且粋€(gè)執(zhí)行語句驮捍。
<strong>二.通過內(nèi)置的 JavaScript 函數(shù)構(gòu)造器(Function())定義</strong>
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
等價(jià)于:
var myFunction = function (a, b) {return a * b}
var x = myFunction(4, 3);
注意:
在 JavaScript 中,很多時(shí)候脚曾,你需要避免使用 new 關(guān)鍵字东且。
<strong>三.函數(shù)提升(Hoisting)</strong>
提升(Hoisting)應(yīng)用在變量的聲明與函數(shù)的聲明。使變量和函數(shù)可以在聲明之前調(diào)用本讥。
注意:
聲明方式的函數(shù)可以提升珊泳,使用表達(dá)式定義函數(shù)時(shí)無法提升。
<strong>四.自調(diào)用函數(shù)</strong>
(function () {
var x = "Hello!!";
})();
或:
(function(){
var x = "World!!";
}());
注意:
a.想避免因少寫一個(gè)分號(hào)而拋出TypeError: undefined is not a function異常囤踩,那么就像下面的那樣寫吧旨椒!
;(function(){
console.log('HI');
}());
b.以上函數(shù)實(shí)際上是一個(gè) 匿名自我調(diào)用的函數(shù) (沒有函數(shù)名)。
c首先要牢記一條規(guī)則:括號(hào)會(huì)馬上執(zhí)行其前面的表達(dá)式堵漱。
var i=function (a,b){
return a+b;
}(1,2);
alert(i);
<strong>五.函數(shù)是對(duì)象</strong>
1.在JavaScript解釋執(zhí)行的時(shí)候综慎,實(shí)際上每個(gè)函數(shù)都是被維護(hù)為一個(gè)對(duì)象,即函數(shù)對(duì)象(Function Object)勤庐。
2.函數(shù)對(duì)象與其它用戶所定義的對(duì)象有著本質(zhì)的區(qū)別示惊,這一類對(duì)象被稱之為內(nèi)部對(duì)象,例如日期對(duì)象(Date)愉镰、數(shù)組對(duì)象(Array)米罚、字符串對(duì)象(String)都是屬于內(nèi)部對(duì)象。換句話說丈探,這些內(nèi)置對(duì)象的構(gòu)造器是由JavaScript本身所定義的:通過執(zhí)行new Array()這樣的語句返回一個(gè)對(duì)象录择,JavaScript 內(nèi)部有一套機(jī)制來初始化返回的對(duì)象,而不是由用戶來指定對(duì)象的構(gòu)造方式碗降。
3.在 JavaScript中隘竭,函數(shù)對(duì)象對(duì)應(yīng)的類型是Function,正如數(shù)組對(duì)象對(duì)應(yīng)的類型是Array讼渊,日期對(duì)象對(duì)應(yīng)的類型是Date一樣动看,可以通過new Function()來創(chuàng)建一個(gè)函數(shù)對(duì)象,也可以通過function關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象爪幻。
4.為了便于理解菱皆,將函數(shù)對(duì)象的創(chuàng)建和數(shù)組對(duì)象的創(chuàng)建來比較须误。先看數(shù)組對(duì)象:下面兩行代碼的作用是一樣的,都是創(chuàng)建一個(gè)數(shù)組對(duì)象:
var myArray=[];
等價(jià)于
var myArray=new Array();
同樣仇轻,下面的兩段代碼也是等價(jià)的京痢,都是創(chuàng)建一個(gè)函數(shù):
function myFunction(a,b){
return a+b;
}
等價(jià)于
var myFunction=new Function("a","b","return a+b");
<strong>六.函數(shù)參數(shù)</strong>
1.顯示參數(shù)Parameters
函數(shù)顯式參數(shù)在函數(shù)定義時(shí)列出。
functionName(parameter1, parameter2, parameter3) {
// 要執(zhí)行的代碼……
}
2.隱式參數(shù)Arguments
函數(shù)隱式參數(shù)在函數(shù)調(diào)用時(shí)傳遞給函數(shù)真正的值拯田。
function funTest(a,b){
for(var i in argument){
console.log(argument[i]);
}
}
funTest(1,2,3,'4','5',true,6);//前兩個(gè)是顯示參數(shù)历造,其他都是隱式參數(shù)
3.理解說明:
javascript函數(shù)的參數(shù)與大多數(shù)其他語言的函數(shù)的參數(shù)有所不同。函數(shù)不介意傳遞進(jìn)來多少個(gè)參數(shù)船庇,也不在乎傳進(jìn)來的參數(shù)是什么數(shù)據(jù)類型吭产,甚至可以不傳參數(shù)。
<strong>七.函數(shù)調(diào)用</strong>
1.函數(shù)作為一個(gè)函數(shù)調(diào)用
function myFunction(a, b) {
return a * b;
}
myFunction(10, 2); // 直接調(diào)用函數(shù)鸭轮,返回20臣淤;
注意:
a.在瀏覽器中的頁面對(duì)象是瀏覽器窗口(window 對(duì)象)。以上函數(shù)會(huì)自動(dòng)變?yōu)?window 對(duì)象的函數(shù)窃爷。myFunction() 和 window.myFunction() 是一樣的:
function myFunction(a, b) {
return a * b;
}
window.myFunction(10, 2);//這是調(diào)用 JavaScript 函數(shù)常用的方法邑蒋, 但不是良好的編程習(xí)慣,全局變量按厘,方法或函數(shù)容易造成命名沖突的bug医吊。
b.函數(shù)作為全局對(duì)象調(diào)用,會(huì)使 this 的值成為全局對(duì)象逮京。使用 window 對(duì)象作為一個(gè)變量容易造成程序崩潰卿堂。
function myFunction() {
return this;
}
myFunction(); //f返回是"[object Window]"
2.函數(shù)作為一個(gè)方法調(diào)用
在 JavaScript 中你可以將函數(shù)定義為對(duì)象的方法。
以下實(shí)例創(chuàng)建了一個(gè)對(duì)象 (myObject), 對(duì)象有兩個(gè)屬性 (firstName 和 lastName), 及一個(gè)方法 (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 方法是一個(gè)函數(shù)懒棉。函數(shù)屬于對(duì)象草描。
b.this對(duì)象,擁有 JavaScript 代碼策严。實(shí)例中 this 的值為 myObject 對(duì)象穗慕。
3.使用構(gòu)造函數(shù)調(diào)用函數(shù) // 略掉
4.使用函數(shù)方法調(diào)用函數(shù)
在 JavaScript 中, 函數(shù)是對(duì)象。JavaScript 函數(shù)有它的屬性和方法妻导。
call() 和 apply() 是預(yù)定義的函數(shù)方法逛绵。 兩個(gè)方法可用于調(diào)用函數(shù),兩個(gè)方法的第一個(gè)參數(shù)必須是對(duì)象本身倔韭。
實(shí)例:
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>八.函數(shù)閉包</strong>
1.JavaScript 變量可以是局部變量或全局變量暑脆。私有變量可以用到閉包。
2.在web頁面中全局變量屬于 window 對(duì)象狐肢。
3.變量聲明時(shí)如果不使用 var 關(guān)鍵字,那么它就是一個(gè)全局變量沥曹,即便它在函數(shù)內(nèi)定義份名。
4.內(nèi)嵌函數(shù)
5.函數(shù)閉包
var add = (function () {
var counter = 0;
return function() {return counter += 1;}
})();