1.函數聲明
使用關鍵字funciton關鍵字來聲明,後面跟上一組參數以及函數體.
無參數
function boy() { //函數的聲明
//代碼
}
函數的聲明已經完成,但是還不能運行,這是我們需要調用函數才能是這個函數運行.
box(); //函數的調用,調用的位置可以放在函數聲明的前面
有參數
function boy(name,age) {
//代碼
}
boy("name",age);
如果不傳參數進去,就會定義爲undefined
函數表達式
var print = function (){
// ...
};
採用函數表達式聲明函數時,function命令後面不帶有函數名。如果加上函數名,該函數名只在函數體內部有效,在函數體外部無效。
var print = function x(){
console.log(typeof x);
};
x
// ReferenceError: x is not defined
print()
// function
這個x只在函數體內部可用,指代函數表達式本身,其他地方都不可用。這種寫法的用處有兩個,一是可以在函數體內部調用自身,二是方便除錯(除錯工具顯示函數調用棧時,將顯示函數名,而不再顯示這裏是一個匿名函數)
需要時,可以採用下面的形式聲明函數。
var f = function f() {};
函數的屬性和方法
name屬性
name屬性返回緊跟在function關鍵字之後的那個函數名
function f1() {}
f1.name // 'f1'
var f2 = function () {};
f2.name // ''
var f3 = function myName() {};
f3.name // 'myName'
length屬性
返回函數定義中參數的個數
function f(a, b) {}
f.length //2
toString
返回函數的源碼
function f() {
a();
b();
c();
}
f.toString();
function f() {
a();
b();
c();
}
函數內內部的註釋也是可以返回的
函數內部的變量提升
var 命令聲明的變量,不管在什麼位置,變量聲明都會被提升到函數體的頭部.
function foo(x) {
if (x > 100) {
var tmp = x -100;
}
}
等同於
function foo(x) {
var tmp;
if (x > 100) {
tmp = x -100;
}
}
函數本身的作用域
函數本身也有一個值,也有自己的作用域.她得作用域綁定其聲明時所在的作用域
var a = 1;
var x = function () {
console.log(a);
};
function f() {
var a = 2;
x();
}
f(); //1
函數x在函數f的外面聲明的,所以它的作用域綁定外層,內部變量a不會到函數體f體內取值.
2.return返回值
函數都是調用後直接執行的.實際上,任何函數都可通過return語句跟後面的要返回的值來實現返回值.
function boy() {
return "Hello world!" //表示把這句話字符串返回回來
}
這時我們使用boy()進行調用,是沒有作用的.
它實際進行的操作爲:
boy() = "Hello world!";
alert(boy()); //調用函數返回值,然後輸出
有參數的同理是一樣可以得到的.
我們還可以把函數的返回值賦給一個變量,然後通過變量進行操作.
var strInfo = boy('馬雲',40);
alert(strInfo);
return與具有還有一個功能是退出當前函數
function boy() {
if( num < 5 ) return num; //滿足條件,返回num
return 100; //返回之後,就不執行下面的語句了
}
alert(box(10));
3.arguments對象
ECMAScript函數不介意傳遞進來多少參數,也不會因爲參數不統一而錯誤.實際上,函數體內可以通過arguments對象來接收傳遞進來的參數.
function boy() {
return arguments[0]+'|'+arguments[1]+'|'+arguments[2];
}
boy("boy",23,"web前端");
可以利用length的屬性(arguments.length),來進行動態操作.
4.重載:根據不同的參數調用相同的函數
function box(num,a) {
return num + 100;
}
function box(num) { //第二個函數把第一個函數覆蓋掉,不具備重載功能
return num + 150;
}
alert(box(50,1));
//重載就是根據參數,選擇相同函數名而參數不同的函數