1. 程式人生 > >web Function函式

web Function函式

 javascript中函式定義

js中函式一般定義如下:

function functionName(arg0,arg1,arg2,...,argN) {

statements;
}
其中functionName是函式名,arg0,…argsN是引數,沒有具體型別,可以接受任何型別的引數,例如Boolean,Number,String,Object等。function可以有返回值(返回值可以返回任何型別),也可以沒有返回值

來看一個function示例:

function printHello(message) {
alert(message);
}

printHello("helloworld");
將會彈出 helloworld

帶返回值的函式

function sum(num1,num2) {
return num1 + num2;
}

alert(sum(2,6));
輸出8
這樣來看,其實和java中也差別不大,但是關鍵的是在js中也允許這樣的程式碼存在

alert(sum(2,6));
var res = sum(1);
alert(sum(1,2,3));
var res2 = sum;
alert(sum());
這樣一來,和java中相差就很大了。可以看到我們 定義函式是兩個引數,但是呼叫卻可以是0個,1個,甚至3個引數。並且函式名還可以賦值給其他變數。這是怎麼回事呢?下面講解。

3 javascript中function注意事項
1 javascript中function的本質

javascript中函式本質上是一個物件,每個函式都是Function的例項,都與其他物件一樣有屬性和方法。由於函式是物件,因此函式名實際上是指向函式的一個指標,函式名不會與具體的某個函式繫結。

理解以上概念對我們理解javascript中函式非常有用,這些解釋了以下程式碼為什麼會執行結果相同

var res2 = sum;
res2(1,2);
sum(1,2)
以上程式碼結果均是3

 javascript中函式與java的異同

個人覺得javascript中函式與java中的主要區別如下:

js中函式是一個物件,函式名是一個指標。java中函式是物件的一個方法,依附於物件,不能獨立存在。
java中就不說了,很好理解。js中剛剛已經介紹過了,為了理解js中函式是一個物件,我們可以這樣定義sum函式:

var sum = new Function("num1","num2","return num1 + num2");

var sum1 = function (num1,num2) {
return num1 + num2;
};

alert(sum(1,3));
alert(sum1(1,3)) ;
以上兩個結果均輸出4,可以看到,js中函式確實是一個物件。函式名僅僅是一個指向該函式的指標。

js中函式沒有過載,引數沒有型別校驗,呼叫可傳遞0到N個引數
js中函式是一個物件,函式名是一個指標,因此物件沒法過載,定義多個相同名字的函式等於將該物件指向多個函式,最終肯定會以最後的定義為準。

function print() {
return "print1";
}

function print(message) {
return "print2";
}

alert(print());
alert(print("ppp"));
結果都是輸出print2,可見最終print2函式都是返回print2。
另外,js中可以把沒有返回值的函式賦值給某個結果變數,如下:

function noReturn() {
var i = 0;
}

var res = noReturn();
//輸出 undefined
alert(res);
輸出結果是undefined,如果一個函式沒有返回值,被賦值時,預設返回undefined

js中函式內部有兩個特殊物件:arguments,this
我們知道js中函式可以傳遞0到N個引數,那這是怎麼回事呢?原因是js總函式的引數是用一個數組來表示的,這個陣列就是arguments陣列,不論傳遞的多少個引數,函式始終接受到的引數都是這個陣列。可以用陣列的形式來訪問函式引數。如下:

var sum1 = function (num1,num2) {

//arguments length:2 1 3
console.log("arguments length:" + arguments.length + " " + arguments[0] + " " + arguments[1]);
return num1 + num2;
};

alert(sum1(1,3));
當呼叫時,我們可以看到控制檯輸出如下結果:
arguments length:2 1 3

this物件

this的行為與java中類似,它引用的是函式執行的環境物件–也可以說是this值(當在網頁全域性作用域中呼叫函式時,this物件引用的是window物件)。請參考下面例子。

window.color = "red";

//建立一個物件o 指明具有color屬性
var o = {color:"blue"};

function sayColor() {
console.log(this.color);
}

//red
sayColor();

o.saycolor = sayColor;
//blue
o.saycolor();
可以看到,呼叫sayColor()是,當前this物件是window物件,當把sayColor賦值給o時,後面this物件指代的就是o物件了。