總結(jié):數(shù)字+undefined===Nan
一、函數(shù)的使用
1、什么是語(yǔ)句:先看這幾個(gè)概念
表達(dá)式:
a=1 a+b
typeof
語(yǔ)句:代表一定功能的表達(dá)式的組合
a+b;
2、但是特定功能需要幾條語(yǔ)句實(shí)現(xiàn),太復(fù)雜
statement1;
statement2;
statement3;
那么,可以將語(yǔ)句打包成一個(gè)函數(shù),然后調(diào)用這個(gè)函數(shù)即可,如:
function doSomething(){ statement1; statement2; statement3; }
調(diào)用這個(gè)函數(shù)。調(diào)用函數(shù)通過函數(shù)名稱( )的形式調(diào)用
doSomething(); //需要的時(shí)候就調(diào)用
實(shí)例:
function sum(){
console.log('hello')
console.log('wangxiaoqin')
} sum()
//返回
//"hello"
//"wangxiaoqin"
二、聲明函數(shù)
ECMAScript規(guī)定三種聲明函數(shù)方式
1、函數(shù)聲明
//使用function關(guān)鍵字可以聲明一個(gè)函數(shù)
//printName() 即函數(shù)名稱() ,可調(diào)用
function printName(){
console.log('世界');
}
printName();
2、函數(shù)表達(dá)式
/* 通過var 進(jìn)行一個(gè)聲明變量,這里的 變量 等同于 函數(shù)表達(dá)式*/
var printName = function(){
console.log('饑人谷')
};
printName()
//等同于
var printName = 3;
函數(shù)聲明VS函數(shù)表達(dá)式
3、構(gòu)造函數(shù)(不常用)
通過構(gòu)造函數(shù),使用new來創(chuàng)建一個(gè)函數(shù)對(duì)象
var printName = new Function("console.log('Byron');");
三、參數(shù)
1、只使用定義函數(shù)較為僵化,可通過參數(shù)方式讓函數(shù)調(diào)用、復(fù)用。
舉例說明:
function printName(name){
//括號(hào)中的name為函數(shù)的參數(shù)
console.log(name)
}
printName('hunger')
printName('valley) //等同于在函數(shù)設(shè)置變量
function printName(){ //括號(hào)為空括號(hào)
var name = arguments[0]
console.log(name);
}
printName('hunger');
//假設(shè)沒有傳遞參數(shù)
function printName(){ //括號(hào)為空括號(hào)
var name = arguments[0]
console.log(name);
}
printName(); //arguments[0] 為undefined,name=undefined ,那么結(jié)果為undefined
//函數(shù)在定義的時(shí)候可以寫多個(gè)參數(shù)
function printPersonInfo(name, age, sex){
console.log(name)
console.log(age)
console.log(sex) }
2、Arguments傳參數(shù)
通過函數(shù)內(nèi)部的arguments對(duì)象獲取到該函數(shù)的所有傳入?yún)?shù)(按順序傳入),通過
console.log(arguments) //輸出每一個(gè)參數(shù)的值
即:
function printPersonInfo(name, age, sex){ console.log(name) console.log(age) console.log(sex) console.log(arguments) 即:
console.log(arguments[0]===name) console.log(arguments.length) console.log(arguments[1] === age) }
3、實(shí)例
例1:
例2:
例3:
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('小明', 2, '男');
getInfo('小小明', 3);
getInfo('男');
即:
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('小明', 2, '男');
傳遞的參數(shù):最終獲得的值
name:小明 //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。
age: 2 //理由同上
sex: 男 //理由同上
0:valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。
于是先讀取getInfo函數(shù)自己的局部環(huán)境,讀取到了valley。
于是顯示valley。
1: 2 //先讀取getInfo函數(shù)自己的局部環(huán)境,沒讀取到值。于是向上找,找到了輸入的值2。
3: 男 //理由同上
name: valley //在getInfo函數(shù)的局部環(huán)境里向上讀取,在上方發(fā)現(xiàn)了name賦值,所以顯示valley。
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('小小明', 3);
name: 小小明 //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。
age: 3 //理由同上。
sex: undefined //第三個(gè)參數(shù)沒有輸入,所以顯示undefined。
0: valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。于是先讀取getInfo函數(shù)自己的局部環(huán)境, //讀取到了valley。于是顯示valley。
1: 3 //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。
name: valley //在函數(shù)局部環(huán)境內(nèi)向上讀取發(fā)現(xiàn)已經(jīng)對(duì)name賦值,所以顯示valley。
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name); \
}
getInfo('男');
name: 男 //在自己的局部環(huán)境的上方?jīng)]有讀取到值,所以向上一級(jí)讀取,顯示為男。
age:undefined //整個(gè)環(huán)境內(nèi)都沒有賦值,所以顯示為undefined sex:undefined //整個(gè)環(huán)境內(nèi)都沒有賦值,所以顯示為undefined
0: valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。于是先讀取getInfo函數(shù)自己的局部環(huán)境, 讀取到了valley。于是顯示valley。
name:valley //在函數(shù)局部環(huán)境內(nèi)向上讀取發(fā)現(xiàn)已經(jīng)對(duì)name賦值,所以顯示valley。
題外話:
函數(shù)是有參數(shù)的,在聲明函數(shù)的時(shí)候可以在定義的函數(shù)旁加一個(gè)參數(shù),當(dāng)你要執(zhí)行的時(shí)候,需要調(diào)用帶有該參數(shù)的函數(shù),如果沒有傳遞這個(gè)參數(shù)的話,相當(dāng)于這個(gè)帶有參數(shù)的函數(shù)結(jié)果就為:undefined
如:
function printName(){
var name = arguments[0]
console.log(name);
}
printName()
-->輸出:undefined
圖:
5、函數(shù)返回值
函數(shù),即把一段語(yǔ)句包裝起來,調(diào)用函數(shù)的參數(shù)的時(shí)候,就會(huì)執(zhí)行這些語(yǔ)句,更多的是得到一些結(jié)果。就像表達(dá)式給一個(gè)結(jié)果,希望函數(shù)執(zhí)行后給一個(gè)反饋,我們可以通過return來實(shí)現(xiàn)
如:
function sum(a,b,c){
console.log(a+b) //只是把計(jì)算的結(jié)果展示在控制臺(tái),無其他事(用戶若不打開控制臺(tái)無意義)
return a+b }
var result = sum(4,6)
console.log(result) //返回10
假設(shè):沒有return,會(huì)出現(xiàn)什么結(jié)果呢?
以上結(jié)果以說明,console.log(a+b),輸出10,只是把計(jì)算結(jié)果呈現(xiàn)在控制臺(tái),表示它做了這件事情,只不過沒有把結(jié)果返回。但是console.log(a+b)本身也是一個(gè)函數(shù),整個(gè)函數(shù)本質(zhì)上執(zhí)行的結(jié)果為undefined,調(diào)用result,結(jié)果也是undefined
?錯(cuò)誤寫法:
function sum(a,b,c){
return console.log(a+b)
}
var result = sum(4,6)
console.log(result)
//返回10
//undefined
但是有這樣的寫法:
function fn(score){
if(score<0)
return console.log(score)
}
fn(-3)
//等同于
function fn(score){
if(score<0) {
return undefined
}
console.log(score)
}
fn(-3)
//等同于
function fn(score){
if(score<0) {
}
else{
console.log(score)
}
}
fn(-3)
四、重載
1、什么是函數(shù)重載
重載是很多面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)多態(tài)的手段之一,在靜態(tài)語(yǔ)言中確定一個(gè)函數(shù)的手段是靠方法簽名——函數(shù)名+參數(shù)列表,也就是說相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù),稱為函數(shù)重載。
2、JS沒有函數(shù)重載
在JavaScript中沒有函數(shù)重載的概念,函數(shù)通過名字確定唯一性,參數(shù)不同也被認(rèn)為是相同的函數(shù),后面的覆蓋前面。函數(shù)調(diào)用沒必要把所有參數(shù)都傳入,只要你函數(shù)體內(nèi)做好處理就行,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)
傳遞不同的參數(shù),做不同的事情,根據(jù)函數(shù)中參數(shù)類型和個(gè)數(shù)去進(jìn)行邏輯判斷。