1.函數(shù)是什么帅腌?
JavaScript函數(shù)是指一個(gè)特定代碼塊乳附,可能包含多條語句评凝,可以通過名字來供其它語句調(diào)用以執(zhí)行函數(shù)包含的代碼語句坯钦。
比如我們有一個(gè)特定的功能需要三條語句實(shí)現(xiàn)
statement1;
statement2;
statement3;
那么每次想實(shí)現(xiàn)這個(gè)功能的時(shí)候就需要寫這三句話蟀苛,很麻煩益咬,我們可以把這三條語句打包為一個(gè)函數(shù)
function doSomething(){
statement1;
statement2;
statement3;
}
這樣每次想實(shí)現(xiàn)功能的時(shí)候我們就調(diào)用一下函數(shù)就可以了,調(diào)用函數(shù)通過函數(shù)名稱()的形式調(diào)用
doSomething();
注意:一般給函數(shù)命名為駝峰式帜平。
2.構(gòu)造函數(shù)
ECMAScript規(guī)定了三種聲明函數(shù)方式
1.構(gòu)造函數(shù)
首先函數(shù)也是對象的一種幽告,我們可以通過其構(gòu)造函數(shù),使用new來創(chuàng)建一個(gè)函數(shù)對象:
var sayHello = new Function("console.log('hello world');");
不推薦使用
2.函數(shù)聲明
使用function關(guān)鍵字可以聲明一個(gè)函數(shù)
//函數(shù)聲明
function sayHello(){
console.log('hello')
}
//函數(shù)調(diào)用
sayHello()
注意:聲明不必放到調(diào)用的前面裆甩。
3.函數(shù)表達(dá)式
var sayHello = function(){
console.log('hello');
}
sayHello()
注意:聲明必須放到調(diào)用的前面冗锁。
3.參數(shù)
function sayHello(name){
console.log('hello ' + name)
}
sayHello('若愚')
sayHello('饑人谷')
多個(gè)參數(shù)
函數(shù)在定義的時(shí)候可以寫多個(gè)參數(shù):
function printInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
}
printInfo('饑人谷', 2, 'boy')
arguments
在函數(shù)內(nèi)部,你可以使用arguments對象獲取到該函數(shù)的所有傳入?yún)?shù)
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments[0]);
}
4.重載
在其他語言中
int sum(int num1, int num2){
return num1 + num2;
}
float sum(float num1, float num2){
return num1 + num2;
}
sum(1, 2);
sum(1.5, 2.4);
在 JS 中
沒有重載! 同名函數(shù)會覆蓋。 但可以在函數(shù)體針對不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
5.返回值
有時(shí)候我們希望在函數(shù)執(zhí)行后得到一個(gè)結(jié)果供別人使用嗤栓,可以通過return來實(shí)現(xiàn)
function sum(a, b){
a++;
b++;
return a + b;
}
var result = sum(2, 3);
conslole.log(result);
注意1:注意點(diǎn)如果不寫return語句冻河,函數(shù)也會默認(rèn)給我們返回undefined箍邮。
注意2:函數(shù)在執(zhí)行過程中,只要遇到return就會立即結(jié)束退出函數(shù)體叨叙。
function fn(a){
if(a < 0){
return;
}
//下面沒用 else 锭弊,但效果一樣
a++;
return a + a;
}
注意3:函數(shù)的返回值和 console.log()是兩個(gè)不同的東西,千萬不要這樣:
function getAge(age){
return console.log(age);
}
6.聲明前置
var 和 function 的聲明前置:
在一個(gè)作用域下擂错,var 聲明的變量和function 聲明的函數(shù)會前置
console.log(a); //undefined
var a = 3;
console.log(a); //3
sayHello();
function sayHello(){
console.log('hello');
}
函數(shù)表達(dá)式
console.log(fn); //undefined
fn(); //報(bào)錯(cuò)
var fn = function(){}
函數(shù)表達(dá)式和 var 一個(gè)變量沒什么區(qū)別廷蓉,不會前置。
函數(shù)內(nèi)部的聲明前置
function fn(){
console.log(a) //undefined
var a = 3
console.log(a)
}
fn()
命名沖突時(shí)
先前置马昙,再覆蓋
var fn = 3;
function fn(){}
console.log(fn); // 3
function fn(){}
var fn = 3;
console.log(fn); // 3
7.作用域
在 JS 中只有函數(shù)作用域桃犬,沒有塊作用域
function fn(){
var a =1;
if(a > 2){
var b = 3;
}
console.log(b);
}
fn(); // undefined
console.log(a); // "ReferenceError: a is not defined
8.var
聲明一個(gè)已經(jīng)存在的變量
function fn(){}
var fn
console.log(fn)
var a = 1
var a
var a
console.log(a)
var重復(fù)聲明一個(gè)已經(jīng)存在的變量,原變量值不變行楞。
不加var作用
function fn(){
a = 1;
}
fn();
console.log(a); // 1
可以看到不寫var會聲明一個(gè)全局的變量调榄,這是我們在編程中應(yīng)該要避免的,即使真的需要全局變量辐脖,也應(yīng)該在最外層作用域使用var聲明奥裸。
9.遞歸
遞歸的特點(diǎn)
1.自己調(diào)用自己
2.設(shè)定終止條件
3.優(yōu)點(diǎn): 算法簡單
4.缺點(diǎn): 效率低
求 n 的階乘n!
function factor(n){
if(n === 1) {
return 1
}
return n * factor(n-1)
}
factor(5)
求 1+2+...+n 的值
function sum(n){
if(n === 1) {
return 1
}
return n + sum(n-1)
}
sum(10)
立即執(zhí)行函數(shù)表達(dá)式
(function(){
var a = 1;
})()
console.log(a); //undefined
作用: 隔離作用域
其他寫法
(function fn1() {});
// 在數(shù)組初始化器內(nèi)只能是表達(dá)式
[function fn2() {}];
// 逗號也只能操作表達(dá)式
, function fn3() {};