函式簡介:
函式function
-函式也是一個物件
-函式中可以封裝一些功能(代碼),在需要使用時呼叫這些功能(代碼)
-函式中可以保存一些代碼在需要時呼叫
-使用typeof檢測一個函式物件的時候,會回傳function
一、創建函式
1、使用建構式創建一個函式物件
例:fun1 = new Function();
fun1();// 呼叫函式語法:函式物件(); 當呼叫函式時,函式中的封裝代碼會按照順序
2、使用函式宣告創建一個函式物件
語法:function 函式名([形參1,形參2...形參n]){
//陳述句
};
說明:[形參1,形參2...形參n]這里的[]表示可以使用引數,也可以不適用引數
函式的呼叫:函式名([實參1,實參2,...]);
例:function add(a,b){
c = a+b;
console.log(c);
};
add(1,2);
3、使用函式運算式創建一個函式/匿名函式
例:var fun3 = function(){
//陳述句
};
fun3();
二、函式的引數
多個形參之間用“,”隔開,宣告形參就相當于在函式內部宣告了對應的變數,但并不賦值。
例:function add(a,b){
c = a+b;
console.log(c);
};
add(1,2);
注意:1、呼叫函式時,決議器不會檢查實參的型別,所以要注意是否可能會接收到非法引數,如果有可能則需要檢測實參的資料型別。
例:function add(a,b){
c = a+b;
console.log(c);
};
add(true,123);
//結果為true123,因為傳入一個true,加法運算的時候進行了將true隱式轉換為了字
符串,然后再與123相加,相當于字串鏈接,所以當有可能傳入非法引數時,需要檢
查引數的型別。
2、呼叫函式時,決議器不會檢查實參的數量,多余的實參將不賦值,如果實參少于形參時,
則沒有實參對應的形參將是undefined。
例:function sum(a,b,c){
console.log(“a=”+a);
console.log(“b=”+b);
console.log(“c=”+c);
console.log(“sum=”+a+b+c);
};
sum(1,2);//實參少于形參,結果:a=1,b=2,c=undefined,sum=NaN
sum(1,2,3,4);//實參多余形參,結果:a=1,b=2,c=3,sum=6
三、函式的回傳值與立即執行函式
1、函式的回傳值:創建一個函式用來求兩數之和,可以通過return來回傳函式的回傳值。
例如:function add(a,b){
c = a+b;
return c;
};
var num = add(1,2);
console.log(num);//結果:3
2、立即執行函式:函式定義完,立即被呼叫,這種函式叫做立即執行函式,立即執行函式往往只是
只會執行一次。
例如:(function(){
alert(“立即執行函式!”);
})();
四、函式與方法
1、函式:通過函式名呼叫,叫函式
例如:function Hello(){
alert(“Hello”);
};
Hello();//通過函式名呼叫,叫函式
2、方法:函式也可以作為物件的屬性,如果一個函式作為一個物件的屬性保存,那么我們稱這個函
數為這個物件的方法,呼叫該函式,就是呼叫該物件的方法。函式與方法只是名稱上的區
別,沒有其他別。
例如:var obj = {
Hello:Hello();
}
obj.Hello();//作為物件的方法呼叫,叫方法
五、宣告提前
1、 變數宣告提前
使用var關鍵字宣告的變數,會在所有代碼執行前被宣告(不會賦值),如果宣告變數不用var關
鍵宣告,則變數宣告不會提前。
例:console.log(a);
var a = 1;
//回傳結果undefined,是因為a被宣告提前了(不賦值),所以當代碼執行到console.log
(a)的時候回傳undefined(a未賦值)
console.log(b);
b = 2;
//報錯,b沒有提前宣告,也沒有賦值,所以當代碼執行到console.log(b)的時候會報錯
2、 函式宣告提前
使用函式宣告的形式創建函式function(){},它會在所有代碼執行前就被創建,所以可以在函
數宣告前呼叫函式,使用函式運算式創建函式是不會被宣告提前的。
例:使用函式宣告的形式創建函式:
//fun1();//可以在宣告前呼叫
function fun1(){
//陳述句
};
fun1();//也可以在宣告后呼叫
使用函式運算式創建函式:
var fun2 = function(){
//陳述句
}
fun2();//只能在函式宣告后呼叫,如果在函式宣告前呼叫會報錯
六、作用域
作用域:作用域是指一個變數的作用范圍
JS中一共有兩種作用域:1、全域作用域 2、函式作用域(區域作用域)
1、 全域作用域
-直接寫在JS檔案或script標簽中的JS代碼,都在全域作用域
-全域作用于在頁面打開時創建,頁面關閉時銷毀
-全域作用域中有一個window物件,它代表一個瀏覽器的視窗,由瀏覽器創建,可以直接使用
-全域作用于中: 創建的變數都會作為widow物件的屬性保存
全域中的函式都會作為window物件的方法保存
-全域作用域中的變數都是全域變數,在頁面的任意部分都可以訪問到
2、函式作用域(區域作用域)
-呼叫函式時創建函式作用域,函式執行完畢后,作用域銷毀
-每呼叫一次函式就會創建一個新的函式作用域,它們之間是相互獨立的
-在函式作用域中可以訪問全域變數,但是在全域作用域中無法訪問區域變數
-當函式作用域操作一個變數時,它會先在自身作用域中尋找,如果有就直接使用,如果沒有就向
上一級作用域中尋找,如果全域作用域中仍然沒有,則會報錯ReferenceError
-在函式中想要訪問全域變數可以使用window物件,因為全域作用域中創建的變數都會作為
widow物件的屬性保存
六、this
this:決議器在呼叫函式時每次都會向函式內部傳遞一個隱含的引數,這個引數就是this,this指
向的是一個物件,這個物件我們稱為函式執行的背景關系物件,根據函式呼叫方式的不同,this
會指向不同的物件(以函式的形式呼叫時,this始終都是window。以方法的形式呼叫時,this
是呼叫方法的那個物件)
例:function fun(){
alert(1);
};
fun();//以函式的形式呼叫,this是window
var obj = {
fun:fun
};
obj.fun();//以方法的形式呼叫,this是obj
this總結:
1、 以函式的形式呼叫時,this始終都是window
2、 以方法的形式呼叫時,this是呼叫方法的那個物件 (下文)
3、 以建構式的形式呼叫時,this是那個新建的物件(下文)
4、 使用call與apply呼叫時,this是指定的那個物件(下文)
七、建構式
建構式:創建一個建構式,用來專門創建一類物件,建構式就是一個普通函式,創建方式和普
通函式沒有區別,不同的是建構式習慣首字母大寫,普通函式直接呼叫,建構式需要
使用new關鍵字呼叫
建構式執行流程:
1、 創建一個新的物件
2、 將新創建的物件設定給函式中的this,在建構式中可以使用this來參考新建的物件
3、 逐行執行函式中的代碼
4、 將新建的物件作為回傳值回傳
使用同一建構式創建的物件,我們稱為一類物件,也將建構式稱為一個類,將通過一個建構式
創建的物件,稱為該類的實體。
例:function Person(name,age,address){ //Person 類
this.name = name;
this.age = age;
this.address = address;
};//以建構式的形式呼叫this,this就是那個新建的物件
var p = new Person(“張三”,23,”廣州”);//呼叫
console.log(p);//Person類的實體
使用instanceof可以檢查一個物件是否是該類的實體,語法:物件instanceof 建構式,如果是則
回傳true,如果不是則回傳false。
例:console.log(p instanceof Person); //true
八、原型物件
1、我們創建的每一個函式,決議器都會向函式中添加一個屬性prototype,這個屬性對應著一個物件
,這個物件就是我們所謂的原型物件,如果函式作為普通函式呼叫prototype沒有任何作用,當函式
以建構式的形式呼叫時,它所創建的物件都會有一個隱藏的屬性指向該建構式的原型物件,我們
可以通過__proto__來訪問該屬性
2、 原型物件就相當于一個公共區域,所有同一個類的實體都可以訪問到這個原型物件,我們可以將
物件中共有的內容,統一設定到原型物件中
3、 原型物件也是物件,所以它也有原型,但我們使用一個物件的屬性或方法時,會先在自身中尋找
如果自身中有就直接使用,如果沒有就去原型物件中尋找,如果原型物件中有則使用,如果沒有
則去原型物件中的原型物件中尋找,直到找到object物件的原型,object物件的原型沒有原型
,如果在object中依然沒有找到,則回傳undefined
4、 使用in檢查物件中是否有指定屬性時,自身有會回傳true,自身沒有原型物件中有也會回傳true
使用物件的hasOwnProperty()方法來檢查物件自身中是否含有該屬性時,只有當物件自身含有該
屬性才會回傳true,否則回傳false
九、函式的方法
call()與apply()
-這兩個方法都是函式物件的方法,需要通過函式物件來呼叫
-當對函式呼叫call()和apply()時,都會執行
-在呼叫call()與apply()可以將一個物件指定為第一個引數,這個物件會成為函式執行時的this
-call()方法可以將實參在物件后依次傳遞,例:fun.call(物件,形參一,形參二...);
-apply()方法需要將實參封裝到資料里統一傳遞,例:fun.apply(物件,[形參一,形參二...]);
十、arguments
在呼叫函式時,瀏覽器每次都會傳遞進來兩個隱含引數:
1、 函式的背景關系物件this
2、 封裝實參的物件arguments
- arguments是一個類陣列物件,它可以通過索引來操作陣列,也可以獲取長度
-在呼叫函式時,我們所傳遞的實參都會在arguments中保存
- arguments.length可以用來獲取實參的長度
-我們即使不定義形參,也可以通過arguments來使用實參,比較麻煩
arguments[0] 表示第一個實參,arguments[1] 表示第二個實參
-它里面有一個屬性callee,這個屬性對應一個函式物件,就是當前正在執行的函式物件
例:function fun(){
console.log(this);
console.log(arguments.length);
console.log(arguments[0]);
console.log(arguments.callee);
};
fun(1,2,3);
輸出:window物件
3
1
f fun(){
console.log(this);
console.log(arguments.length);
console.log(arguments[0]);
console.log(arguments.callee);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/58572.html
標籤:JavaScript
下一篇:正則運算式總結
