JS趴趴往上走-函式新手篇
函式
函式是一種用來執行某一事件或計算的語法,它可以包含一段或多段語法,可以重複使用;但是你使用typeof
時你會得到function
的結果,但是它是屬於物件object
哦一個函式的組成為:
1.函式名稱
2.參數列表:放置括號
( )
內3.執行內容:放置大括號
{ }
內
fumction 名稱([參數]){
//執行內容
}
此組成屬於函式陳述句也稱函式宣告,我們帶入值會變成
function abc(number){ //abc為函數名稱 number為參數
var a=1;
console.log(a+number);
}//大括號為內容
abc(2);//執行abc函式,()內的參數會傳到number內
//所以console.log(a+number)的結果為3
全域變數和區域變數的差異
在變數篇有提到變數在不同地方,它能使用的區域也會不一樣
var x=1;
console.log(x);
這邊答案是
1
那這樣呢?
var x=1;
function abc(){
var x=2;
}
abc();
console.log(x);
猜出來答案是多少嗎?答案也是
1
哦!在這邊,因為
var x=2;
是在function
內部宣告的,function
內宣告的只會在function
裡執行完成,所以在這裡的x是屬於區域變數,而console.log(x);
是在function
外執行,所以它拿到的x
值是外面x
的哦接下來下面這題呢
var x=1;
function abc(num){
var x=2+num;
console.log(x);
}
abc(2);
答案是
4
哦! ,依照上述所說,console.log()
是寫在function
內部,所以它執行是內部的x
,接著abc的參數為2
,故2+2=4
接著這題範例答案大家猜猜看
x
和b
是多少
var x=123;
function abc(){
var b=456
x=2;
}
abc();
console.log(x);
console.log(b);
答案是........
x
是2
,b
是ReferenceError: a is not defined
大家會覺得奇怪,明明是在外面
console.log();
的,怎麼會是拿內部的x
呢?其實大家有沒有發現,內部的
x
沒有使用var
宣告呢,當你沒重新宣告,那就不屬於內部的function
了,它就會往最外層找它的同伴,找到有宣告的同名變數故這裡的
function
內的x
就開始往外找,找到外層的x
後變更了它的數值,外層的數值改變成了2
哦而
b
顯示錯誤則是因為它是屬於function
內部的區域變數,當fuction
執行完畢後就會被刪除,記憶體空間也會被釋放,導致內部宣告的區域變數是無法拿到外層去使用的所以說
function
可以讀取外層已宣告的變數,但外層不可以拿內層宣告的變數哦,顧名思義愈外面階層愈低提升 (Hoisting)
console.log(a);
var a=123;
consoloe.log(a);
答案是多少呢?
答案是
undefined
和123
會產生這樣的結果是變數的宣告被提升(Hoisting)跑到最前面去了,依照剛剛的範例來說,JS知道你宣告了一個
a
,但還不知道你宣告的變數是多少,所以第一個console.log(a)
是undefined
,到了下一行它知道你a=123
,所以下一個console.log(a);
就是123
在JS的眼裡,它的樣子是變成
var a;
console.log(a); //undefined
a=123;
consoloe.log(a); //123
接下來我們來看這個範例
a();
function a(){
console.log("hello");
}
答案是
"hello"
,function
也跟var
一樣,也會提升哦這邊提醒大家,若
function
和var
比,function
的提升會比var
優先載入
console.log(a); //function
var a=124;
function a(){}
這邊你可能會疑惑說,照
function
先提升的話,那var a=124;
不是一個一個執行後會被蓋過去,所以console.log(a);
應該等於124
呀?因為提升的只有變數的宣告,賦值不會!
所以,在JS眼裡它覺得是
function a(){}
var a; //已宣告過a,變數重複宣告是沒用的
console.log(a); //function
a=124;
若你在最下面增加
console.log(a);
會得到的答案是124
再來我們看這題
var name="abcde";
function name(){
console.log("呼叫1");
}
function name(){
console.log("呼叫2");
}
name();
答案是"呼叫2"
在JS的眼裡,它的樣子是
function name(){ //先提升function
console.log("呼叫1");
}
var name; //宣告name(已宣告過name所以此行沒用)
//其他的一行一行執行
name="abcde";
name=function(){
console.log("呼叫2");
}
name();
retrun
return
是一種可以回傳function
結果的功能剛剛我們有提到,區域變數執行完後就會刪除,所以我們可以搭配
function
在運算完以後使用return
,外部的 呼叫就能知道回傳的結果,當然只能限定你要return
的值,其他依然還是會被刪除哦
function a(num){
retrun num+3
}
a(5); //8
以上面範例來講,當你給的參數
5
,丟給function
的參數執行,而你要retrun
結果的值num+3
,之後回傳給function
,答案就是8
我們換另一種方法
假如說有一家麵包店的麵包賣35元,小明進去購買3個麵包的價錢,但是小明在店內打破了別人的盤子,總共花費了205元,但你只叫小明回傳(
return
)購買的麵包多少錢,而其他小明在店內所發生的事情是不知道的哦
function bakery(num){
var bread=35;
var fixed=100;
var total=bread*num+fixed;
return bread*num //回傳買了3個35元的麵包
}
var ming=bakery(3); //購買3個
console.log(ming) //105
所以當你要回傳你要的結果,可以使用
return
,不然外面都不知道這個function
在裡面都做了什麼事了www參考資料:
https://ithelp.ithome.com.tw/articles/10191549
https://blog.techbridge.cc/2018/11/10/javascript-hoisting/
留言
張貼留言