函數定義
通過關鍵字function來定義一個函數
function abs(x) {
if (x < 0)
return -x;
else
return x;
}
js中函數也是一個對象,也可以按以下方式定義一個函數,將函數名作為一個指向該函數的變量。
var abs = function(x) {
if (x < 0)
return -x;
else
return x;
};
函數的參數 arguments
arguments是一個類似Array的數據集合,在函數內部,指向該調用該函數所傳遞的所有參數。
JavaScript允許傳入任意個參數,傳入的參數比定義的參數多也沒有問題。為保證所用參數正確,在使用前可以利用arguments來獲取所有傳遞過來的參數,對其進行參數驗證。
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
ES6標準引入了rest參數,可以方便地獲取函數定義以外的參數。
function foo(x, y, ...rest) {
console('x=' + x);
console('y=' + y);
console(rest);
}
foo(1 ,2 ,a ,royal ,100);
//x = 1
//y = 2
//Array [a , royal , 100]
foo(1);
//x = 1
//y = undefined
//Array []
rest參數只能寫在最后,前面用...標識,從運行結果可知,傳入的參數先綁定a、b,多余的參數以數組形式交給變量rest,所以,不再需要arguments我們就獲取了全部參數。
如果傳入的參數連正常定義的參數都沒填滿,也不要緊,rest參數會接收一個空數組(注意不是undefined)。
方法
將一個函數綁定到一個對象上,則稱此函數為這個對象的方法。
var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
xiaoming.age(); // 今年調用是25,明年調用就變成26了
要保證this指向正確,必須用obj.xxx()的形式調用!ECMA決定,在strict模式下讓函數的this
指向undefined。在非strict模式下,直接調用某個對象的方法它重新指向全局對象window。
apply
要指定函數的this指向哪個對象,可以用函數本身的apply方法,它接收兩個參數,第一個參數就是需要綁定的this變量,第二個參數是Array,表示函數本身的參數。
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 參數為空
另一個與apply()類似的方法是call(),唯一區別是:
apply()把參數打包成Array再傳入;
call()把參數按順序傳入。
比如調用Math.max(3, 5, 4),分別用apply()和call()實現如下:
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5