iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
0
Modern Web

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

函數(3) 省略寫法及其中this 的轉指向

今天學習了函數的簡略寫法

其實跟其他語言的lambda有點像
函數不好好寫,省略幹麻呢?
當然是因為這樣看起來比較牛B...
...不是
是因為要看懂別人裝牛B 的程式碼...
.
.
.
但其實也不這麼單純只是省略而已,其中this 的指向也會因此改變
待我們下面來實驗看看
首先先看簡略寫法

簡略寫法

var kkk=function (a){
    console.log(a);
}
kkk(5);
var kkk=(a)=>{console.log(a)} //省略function ,,在() 後面加=>
kkk(6);
var kkk=a=>console.log(a);  //函式內只有一句時,連{} 都可以省
kkk(7);

欸,果然都可以順利輸出
https://ithelp.ithome.com.tw/upload/images/20181014/20110579ANBKyievaz.png
所以果然很省no 那這邊是只有一個參數的方法
如果是不用參數要怎麼寫呢
底下示例

var kkk=function (){
    console.log('說你好');
}
kkk();
var kkk=()=>{console.log('說你好1')} //省略function ,,在() 後面加=>
kkk();
var kkk=()=>console.log('說你好2');  //函式內只有一句時,連{} 都可以省
kkk();

哦哦哦哦哦

這邊要注意的是,如果有return 的話,大括號是不能省的

var kkk=function (){
    return 100;
}
console.log(kkk());
var kkk=()=>{return 101}
console.log(kkk());

這樣就可以,但是沒加上大括號就會出錯了
https://ithelp.ithome.com.tw/upload/images/20181014/201105794fjOi95yMc.png

this 的轉向

用省略寫法的話 this 會改變指向哦!
超靈異的吧....
繼上次super 的指向會變之後

這邊this 的指向也很善變

我想這種特性是寫 c-like 的人無法接受的
不過,你寫的是js,就得認命好唄
讓我們來時看看範例

obj={
    a:5,
    b:function(){console.log(this)},
    c:()=>console.log(this)

}

好了,我們期待已久的時候到了

我們前面學過在函數中的this 對吧
知道他是什麼 通常是誰呼叫的this 就是指誰!

那好,現在來看看到底
obj.b()
obj.c()
都是obj 調用的,這些this 應該都會指向obj 對不對
我這樣說肯定答案是不一樣了…

但你還是不相信,我們來眼見為憑

https://ithelp.ithome.com.tw/upload/images/20181014/20110579XKMH4rvbsQ.png

是不是!! 竟然搞這種飛機
指向Window...
(對穿腸又出來噴血了)
jsjs 我真的是...

這邊也會造成不少bug ,一定得注意阿!!!
所以結論是,用省略寫法的this 一定指向window 嗎?
就跟原物件沒關係了嗎?
這個結論當然......

來看一下以下例子

var sss={
    funcK:function(){
        var j=()=>{console.log(this)}
        j();
	}
}

好了根據我們剛才的結論 用省略寫法會指向window
那現在來用 sss.funcK()
看看....
https://ithelp.ithome.com.tw/upload/images/20181014/201105797OqFiPN7OM.png

...這邊又指向sss.funcK

所以我們有了新的結論

用省略寫法中的this 會指向其「所定義的區塊」

如果這樣理解有錯,請有看到的大德再幫忙糾錯 ,謝謝


上一篇
函數的特點(二) IIFE(2)
下一篇
函數(4) 傳值與傳址
系列文
一步一腳印-紮紮實實學es630

2 則留言

0
Luis-Chen
iT邦新手 4 級 ‧ 2018-10-15 11:42:34

我發現大大都有點到 JS 開發上的眉角唉(紮實底)

想必大大應該有寫程式也蠻多年了吧,受小弟一拜 /images/emoticon/emoticon41.gif

Paul.Ciou iT邦新手 5 級 ‧ 2018-10-15 23:42:21 檢舉

這位大大,我沒那麼厲害啦...還有很多不足。感謝你的欣賞,多多指教了!/images/emoticon/emoticon06.gif

0
deh
iT邦新手 5 級 ‧ 2019-12-31 10:18:54
如果有return 的話,大括號是不能省的

var kkk=()=>101;
console.log(kkk());
這樣是OK的

我要留言

立即登入留言