方式一定義函數:
function abs(x){
if (x >= 0) {
return x;
} else{
return -x;
}
}
console.log(abs(-5));
上述函數的定義:
function指出這是一個函數定義;
abs是函數的名稱;
(x)括號內列出函數的參數,多個參數以,分隔;
{ … }之間的代碼是函數體,可以包含若干語句,甚至可以沒有任何語句。
方式二定義函數
var abs = function(x){
if (x >= 0) {
return x;
} else{
return -x;
}
}
//調用方式
console.log(abs(-58));
//傳入爲空時,輸出NaN
console.log(abs());
爲了避免發生undefined,可以對參數進行檢查
function abs(x) {
//判斷x是否爲number類型
if (typeof x !== 'number') {
//拋出異常
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
arguments(用於判斷傳入參數的個數)
JavaScript還有一個免費贈送的關鍵字arguments,它只在函數內部起作用,並且永遠指向當前函數的調用者傳入的所有參數。arguments類似Array但它不是一個Array:
function foo(x){
console.log('x = '+ x );
for (var i = 0; i < arguments.length; i++) {
console.log('arg'+i+'='+arguments[i]);
}
}
console.log(foo(10,20,30,1));
function foot(a,b,c){
if(arguments.length == 3){
c = b;
console.log("c="+c);
b = null;
}else{
throw '參數太多了';
}
}
console.log(foot(1,2,3));
rest
只能寫在最後,前面用…標識,這是ES6標準引入的rest參數
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 結果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 結果:
// a = 1
// b = undefined
// Array []
在JavaScript引擎在行末自動添加分號的機制所以一般寫成
function foo() {
return { // 這裏不會自動加分號,因爲{表示語句尚未結束
name: 'foo'
};
}
名字空間:
全局變量會綁定到window上,不同的js文件如果使用了相同的全局變量或者定義了相同名字的頂層函數,都會造成命名衝突,並且很難被發現。
減少衝突的一個方法是把自己的所有變量和函數全部綁定到一個全局變量中。例如:
//定義唯一全局變量MAPP
var MAPP = {};
//其他變量
MAPP.name = 'myapp';
MAPP.version = 1.0;
MAPP.age = 18;
//其他函數
MAPP.foo = function(){
return 'foot';
};
console.log(MAPP);
把自己的代碼全部放入唯一的名字空間MAPP中,會大大減少全局變量衝突的可能。