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

web Function函數

特殊 this boolean 函數 function ret fin 結果 輸出

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對象了。

web Function函數