iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
1
Modern Web

一步一腳印-紮紮實實學es6系列 第 12

函數的特點(一) 函數呼叫與IIFE(1)

從前用js 函數的方式就是一個 函數名+()
沒想到javascript 中的函數中的知識點還真是多

今天開始來慢慢學習函數

首先來看看有哪些是得學習的

函數呼叫

這有啥特別的呢? 不就直接函數名加()嗎!?

在js中還有以下幾種跟其他語言較不一樣的呼叫方式

以下範例

function myFunc(callType){
    console.log(callType)
}
myFunc('最普通的直接呼叫');
myFunc.call(myFunc,'call呼叫');
myFunc.apply(myFunc,['用apply呼叫']);
myFunc`用es6字串呼叫`;
(function myFunc(callType){
    console.log(callType)
})('IIFE呼叫');

https://ithelp.ithome.com.tw/upload/images/20181012/201105791RtepMtqAf.png

這中間有什麼差異,我們慢慢看下去

即刻調用函式運算式IIFE(Immediately-invoked function expressions)

這中文來名稱自你所不知道的 JS|範疇與Closures,this與物件原型
第三章36頁 這個function expressions 對岸的大德都譯作表達式

不過運算式的確比表達式更貼近
如果是運算式的話 ,一般人的確會想到 1+1 這種運算式
到這行就會立即執行
現在立刻馬上
等等,立即執行?
A「真的是酷斃啦… 怎麼這麼無聊的功能
A「那我定義完函式在下面直接呼叫難道不一樣嗎」
A「省一行的好處在哪?」
B「你把IIFE 想簡單了」
好了這樣大家就知道B 其實是秦王(陳道明飾)
...

回歸正題。

運算式?
表達式?
義大利?

眼尖的人發現 是() 括起來的東西
好像我們平常就有在用
但可能大部份如下所示

(1+1)*2
(2+3)

那我們把函數括起來什麼意思呢
函數後面又加括號什麼意思呢?
先來試一下2個括號
https://ithelp.ithome.com.tw/upload/images/20181012/20110579maLGKY9B6z.png

欸 他竟然說前面那個括號裡面不是function
這表示要是他發現後面有括號的話,前面的()裡一定要是函式

那我們直接把function括起來試試呢?

(function myFunc(){})

function myFunc(){}

我們會發現瀏覽器幫我們把上面括號的內容,去做「運算」了哦!?
回應我們一個function 的訊息
就像是我們先宣告一個myFunc ,然後去問瀏覽器這是什麼
https://ithelp.ithome.com.tw/upload/images/20181012/20110579YEICGwcT2u.png

下面那行是普通的宣告函式而已沒有什麼用,大家不要暈了以為是什麼厲害的東西

所以他會是一個「運算的結果」
那既然是運算,可以做加減乘除嗎?
我們來試試

1+(function myFunc(){console.log('hi')});
//"1function myFunc(){console.log('hi')}"
1-(function myFunc(){console.log('hi')});
//NaN
1*(function myFunc(){console.log('hi')});
//NaN
1/(function myFunc(){console.log('hi')});
//NaN
1&&(function myFunc(){console.log('hi')});

//ƒ myFunc(){console.log('hi')}
1||(function myFunc(){console.log('hi')});
//1

哦哦哦果然可以拿來運算 (無聊)
但至少我們了解這前面括號的意思
這樣子,我們就可以了解
()前面,又在後面加個()是什麼意思

不就跟我們寫一個function()的意思是一樣嗎
所以就是前面括號定義完,後面的括號會讓他變成一個在呼叫的狀態
這樣好像就懂了這個奇異的語法了!?!?

(function myFunc(){console.log('hi')});
(function myFunc(){console.log('hi')})();  //最後加入小括號讓他變成函式呼叫

https://ithelp.ithome.com.tw/upload/images/20181012/20110579gxDspAV5Cx.png

所以想當然 ,如果我們要加入參數,也是在最後面那個小括號加入參數的對吧!
我們來像魯蛇追女一樣打出讓函數打出 hihihi

(function myFunc(greetWord){console.log(greetWord)})('hihihi');

https://ithelp.ithome.com.tw/upload/images/20181012/20110579ZE97p0RXm9.png
的確瀏覽器像個魯蛇!

好吧,所以呢
一寫完立即執行的函式…
對! 有個重點,執行完他就不見了

https://ithelp.ithome.com.tw/upload/images/20181012/20110579CXI5Vu5hq2.png

這是因為在() 裡面,他就像是精神時光屋一樣

是個密閉空間,外面是存取不到的

那你說

既然存取不到,運算完就沒了

=== 那你取什麼名字阿 !?!?!?

是的…被你發現了,真不愧是你

這邊的確可以不用取函式名字歐 呵呵呵

(function (greetWord){console.log(greetWord)})('hihihi');

https://ithelp.ithome.com.tw/upload/images/20181012/20110579hO50XNK2ni.png

哦~ 這邊呢就是一個相當大的重點

因為IIFE 會在目前()作用域執行
不會污染到global
所以在模組化開發上是蠻多在使用的
我們其實知道模組化開發還有新的寫法,不過別急,後面再來研究

篇幅有點長,我們明天再來繼續討論函式的更多特點


上一篇
解構賦值
下一篇
函數的特點(二) IIFE(2)
系列文
一步一腳印-紮紮實實學es630

尚未有邦友留言

立即登入留言