1候齿,ES5函數(shù)
例 function test() {}迄靠,函數(shù)分為四個部分:
第一部分,保留字function卓缰;
第二部分计呈,函數(shù)名,可以省略(function(){}..這是一個匿名函數(shù)anonymous)征唬;
第三部分捌显,一對圓括號,中間為參數(shù)鳍鸵,可為空苇瓣,附帶兩個隱藏參數(shù)尉间,this和arguments偿乖;
第四部分,執(zhí)行的代碼塊哲嘲;
這部分只有一對括號贪薪,作用卻很大。比如調(diào)用一個函數(shù):var ss = aa; 和 var ss = aa(); 是不一樣的眠副。前面的是把函數(shù)的指針賦給了ss画切,ss也就是這個函數(shù),后面的是把aa函數(shù)執(zhí)行的結(jié)果賦給了ss? 囱怕, ss是它的返回值霍弹。
第五部分,最后還可以加一對圓括號娃弓,為調(diào)用函數(shù)典格。
2,ES6箭頭函數(shù)
例 () => {}台丛,函數(shù)僅保留兩個部分:
第一部分耍缴,一對圓括號,傳參挽霉;
第二部分防嗡,執(zhí)行的代碼塊。
第三部分侠坎,最后還可以加一對圓括號蚁趁,為調(diào)用函數(shù)。
以上实胸,僅為結(jié)構(gòu)的簡單差別荣德,用法上要做中注意的是this的指向問題:
ES5中闷煤,this指向函數(shù)執(zhí)行時的上下文環(huán)境對象,this的指向有三種情況:
1涮瞻,如下鲤拿,b()是C對象以屬性的形式調(diào)用的,c.b()署咽,此時 b 函數(shù)中的this指向的是this.c這個對象近顷;
注意:此種調(diào)用方式經(jīng)常會出現(xiàn)this綁定丟失的情況,比如函數(shù)作為參數(shù)傳遞的時候(存在隱式賦值宁否,這時候雖然形式上是obj.fn窒升,實際上等于var a = obj.fn,與直接調(diào)用fn是一樣的慕匠,另比如settimeout等js內(nèi)置函數(shù)饱须,也是一樣)
隱式綁定
2,普通函數(shù)的調(diào)用台谊,b()蓉媳,此時this指向window;
默認(rèn)綁定锅铅。
3酪呻,c.b().call({ name: "B"}),call會使this指向改變盐须。
顯式綁定
以此原理玩荠,衍生出了硬綁定:用一個函數(shù)包含對象c和函數(shù)b(),內(nèi)部調(diào)用b.call(c),重復(fù)使用外部函數(shù)贼邓,實現(xiàn)b的this綁定阶冈。
es5提供了api,b.bind(c)
4塑径,第四種是new操作符創(chuàng)建新對象的四個步驟中女坑,會修改this指向:
1),創(chuàng)建一個新對象
2)晓勇,原型繼承
3)堂飞,綁定this
4),return绑咱,如無return值绰筛,返回本身
以上四中優(yōu)先級:
new > 顯式 > 隱式 > 默認(rèn)
ES6中,箭頭函數(shù)this的指向描融,是定義時铝噩,this的指向?qū)ο蟆4颂幹赶騠actory構(gòu)造函數(shù)的實例窿克。
以上骏庸,歡迎大家借鑒與指正毛甲!