JS Function類型
每個函數都是Function類型的實例,由於函數是對象,函數名實際上是一個指向函數對象的指針,不會與某個函數綁定。
1.函數的聲明:
(1)函數聲明語法:
function sum (num1,num2) {
return num1 + num2;
}
(2)函數表達式語法:
var sum = function (num1,num2) {
return num1+num2
};
(3)由於函數也是對象,所以也可以用構造函數聲明
var sum = new Function("num1","num2","return num1+num2"); // 可以接收任意數量參數,最後一個參數被看成函數體
// 不推薦使用,因為解析了兩次代碼,首先要解析ECMAScript代碼,然後解析傳入的字符串
2.函數沒有重載
因為函數名是指針,聲明同名函數只是改變了指針的指向
3.函數聲明與函數表達式
函數聲明會發生變量提升,而函數表達式不會,一定得等js解析到函數所在語句才有效
4.函數內部屬性
在函數內部,有兩個特殊的對象,arguments和this
(1)arguments是一個類數組對象,包含著傳入函數的所有參數,主要用途是保存函數參數
arguments對象還有一個屬性,callee 指針,指向擁有這個arguments對象的函數
callee 可以用在遞歸中,消除函數名與函數執行緊緊耦合的現象
比如常見遞歸
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num*factorial(num-1);
}
}
可以把上述return 語句寫為 return num*arguments.callee(num-1)
當函數被賦給其他變量,即有另一個指針也指向函數,此時改寫原函數,對另一個指針調用不會產生影響。
(2)this 引用的是函數執行的環境對象,(當在網頁的全局作用域調用時this對象引用的就是window)
5.函數屬性和方法
每個函數有兩個屬性length 和 prototype
lengh表示函數希望接收的命名參數的個數
方法: 設置函數體內this對象的值
(1)apply() 接收兩個參數,一個是在其中運行函數的作用域,一個是參數數組,可以是Array實例,也可以是arguments對象
在嚴格模式下,若沒有指定環境對象而調用函數,this值不會轉型為window,除非明確使用apply或call方法,否則this將為undefined
(2)call()方法與apply()作用相同,他們的區別在於接收參數不同,call接收其余所有參數,傳遞的參數必須逐個列舉出來
call 和 apply 最大的作用其實是擴充函數賴以運行的作用域
如下例子:
window.color = ‘red‘;
var o = {color : ‘blue‘};
function sayColor() {
alert(this.color);
}
sayColor(); // red
sayColor.call(this); // red
sayColor.call(window); //red
sayColor.call(o); // blue
此處sayColor()是定義在全局中的函數,自身運行輸出red很正常,
然後通過call 綁定到this,window 都是一樣的
最後綁定到 o 對象上 為blue 也好理解
相比於把函數加入到o對象中 o.sayColor = sayColor
這種方法解除了 方法與對象的聯系(耦合)
(3)ECMAScript5 還定義了一個bind()方法,會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值
window.color = ‘red‘;
var o = {color: "blue"};
function sayColor () {
alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
this值被綁定到o對象上,然後通過sayColor創建的實例賦給objectSayColor,所以objectSayColor 函數的this值也為o
JS Function類型