函數
函數的作用:功能代碼塊的封裝,減少重複代碼、代碼冗餘。
注:js代碼生命區和執行區在一起。
聲明方式
因爲js是弱類型語言,所以在函數的聲明中,參數的類型可以不寫。
聲明方式1:
function test1(a1,a2){
alert("test01");
}
test1(1,1);//調用
聲明方式2:
var test2 = new Function("a1","a2","alert('test02');");//前面的參數是聲明函數的參數(任意多個),最後一個參數是聲明函數的函數體
test2(1,1);//調用
聲明方式3:
var test3 = function(a1,a2){
alert("我是聲明方式3");
}
test3("a1","a2");//調用
== 上述聲明方式只是在用法上有區別,底層實現原理都一樣==
形參學習
function test1(a1,a2){
alert("test01");
}
test1();
test1(1);
test1(1,1);//調用
test1(1,1,1);
調用函數時,參數可以傳任意個,按順序給函數傳值。如果傳的比需要的少,那麼後面的參數爲undefined,如果傳的比需要的多,那麼多傳的沒有參數接收,無法使用。
返回值
var test4 = function(a1){
alert("函數返回值");
return 1;
}
alert(test4(1));/* 沒有返回值還打印會報錯 */
return 返回值;
輸出的函數如果沒有返回值會報錯。
函數執行符
函數的執行符是“()”,有小括號的時候執行函數,沒有則是一個變量。
function test1(a1,a2){
return "返回值";
}
alert(test1);//輸出test1的值
alert(test1("a1","a2"));//執行test1()並輸出返回值
alert(test1); –
alert(test1(“a1”,“a2”)); –
開發中常用樣式
匿名函數
function test2(fu){//函數參數是另一個函數
fu();
}
//匿名函數做另一個函數的參數
test2(function(){
alert("開發");
});
類學習
類的聲明
類的聲明只用一種形式:
function Person(name,age){
/* 類中定義的變量是對象的公共部分,每個對象可以擴充 */
this.name = name;//不用聲明,自動聲明
this.age = age;
this.id;
this.test = function(a){
alert(a);
}//兩個對象的方法不是同一個 p1.test === p2.test false
}
js類的聲明類似構造器聲明,this.變量名指代類中的變量,用類名後面的參數賦值,或者自己賦值,或者不復制,定義函數與變量相同。類中的變量都不用聲明,js會自動聲明。
在類中定義的變量都是對象公有的部分(原型空間),即之後新建的每一個對象都有這些屬性函數。可以在聲明一個對象之後給對象添加一個變量、函數。如下:
var p1 = new Person("張三",20);
var p2 = new Person("李四",20);
p1.address = "山東省";//Person類裏面沒有adress變量,但是可以自己定義,這裏p1有adress變量,而p2沒有adress變量
類的使用
聲明一個對象:
var p1 = new Person("張三",20);//js中所有變量(對象也是變量)都用var關鍵字
使用對象的變量:
alert(p1.name);
prototype:
類中有函數,每聲明一個對象,都會佔用一塊內存給函數,但是同一個類的不同對象的函數功能都是一樣的,如果讓同一個類的不同對象使用的函數(在內存中的)都是同一個,那樣會大大節省內存空間,使用prototype可以實現這樣的需求。
function User(name,id){
this.name = name;
this.id = id;
this.test1 = function(){
alert("內部函數");
}
}
User.prototype.test2 = function(){//要想使用prototype只能在外面定義
alert("外部函數");
}
var u1 = new User("張三",21);
var u2 = new User("李四",21);
alert(u1.test1 === u2.test1); //false
alert(u1.test2 === u2.test2); //true
類的“繼承”
js沒有繼承,但可以在一個類(子類)中定義另一個類(父類)的變量實現相同效果。
function Person(name,age){
this.name = name;
this.age = age;
this.id;
this.test = function(a){
alert(a);
}
}
function User(name,id){
this.name = name;
this.id = id;
}
User.prototype.test = function(){
alert("我是user");
}
Person.prototype.user = new User();
p1.user.test();
自定義對象
因爲js的類可以進行擴充,同時在開發中很多時候並不知道傳過來的數據是什麼類,所以要使用自定義對象,動態存儲數據。
創建自定義對象:
/* 第一種方法 */
var obj1 = new Object(); //可以認爲對象裏面什麼都沒有
obj1.name = "王二狗";
obj1.id = "2969";
obj1.test = function(){/* 一般用來存儲數據,不會在自定義對象中寫函數 */
alert("我是王二狗");
}
/* 第二種方法 */
var obj2 = {};
obj2.name = "大偉哥";
作用:
很多時候我們沒有辦法預先知道一個對象應該有哪些屬性,所以只能使用自定義對象來存儲數據,保證數據的完整性,常在Ajax中使用。