Javascript 吐槽function

說到funciton,也是我對js很是吐槽的一點,封裝的讓我眼瞎,馬蛋的,哥只能大眼睜着去黑盒的使用,簡直只有完徹底全的聽各種圖書對數組

function的道聽圖說,徹底沒有作到一點點的眼見爲實。app

 

一:function是什麼函數

  在好久好久之前,咱們只知道function是一個函數,用C#的話來講就是一個方法,既然是方法嘛,確定就是掛在類下面的,可是其實呢?spa

在js中函數就是對象,並非咱們慣性思惟中的方法。何覺得證呢?看代碼。prototype

從圖中能夠看到我聲明瞭一個say函數,可是我很奇怪的看到,爲何say函數會有一些屬性和方法呢?好比本該屬於Object的toString,valueOf,日誌

constructor等等?而後比較好奇的去看看constructor究竟是什麼,能夠看到實際上是個Function構造函數,那這樣我就很是清楚了,然來say只不過orm

是Function對象的一個實例引用,知道了這個我就能夠很輕鬆的把代碼恢復以下:對象

二:看看function中一些屬性和方法繼承

  如今咱們知道了function其實就是一個對象,咱們知道全部的引用類型都是繼承自object,那爲了好作比較,我定義了一個object的實例,內存

接下來看看function中到底都有那些專屬屬性和方法。

能夠看到,子類function確實仍是有點本身的東西,那接下來就簡單探討下經常使用的屬性和方法。

 

1. arguments屬性

  說到這個屬性就特麼的來氣,就眼瞎,眼瞎的地方在於這個arguments屬性裏面其實作了不少不少的東西,以致於下面的一些奇怪現象

可能會讓你目瞪口呆!!!

 

<1>奇怪現象一:個人function中都沒有形參,竟然還能接受到實參的值。。。

 

 

<2>奇怪現象2:形參和實參傳遞並不統一,能夠多傳遞,能夠少傳遞,js都不會報錯。

 

 

<3>奇怪現象3:形參和arguments竟然能夠作到同步,太神奇了。

 

上面的三個現象是否是讓你以爲很奇怪???這些奇怪的現象是否是讓你以爲Function中封裝的太狠,由於他們作了不少操做,而你卻只能大眼

瞪小眼,啥也看不到。。。是否是很是遺憾呢???因爲看不到源代碼我也無能爲力,只能根據書中的講解以及本身的理解來領悟了。「高程3」中

是這麼說的,當調用function中傳遞的實參實際上是給了Function構造函數中的一個」內部數組「,而arguments實際上是對」內部數組「的高層封裝,

封裝後的arguments再也不是數組了,而是一個假裝的數組,之因此這麼說是由於arguments還須要一個本身的獨有屬性callee,而這個callee

保存的就是當前的對象say,因此只能把arguments作成對象,我可讓你眼見爲實。

而後最詭異的一個問題就是形參可以和arguments實現數據同步,既然可以作到同步,個人第一個反應就是使用同一塊內存地址,可是仔細想一想

他們怎麼可能作到共享內存地址呢?可是再想一想的話,arguments是對」內部數組「的封裝,我就想這個name應該也是被作過手腳的,也就是說

name其實也是對」內部數組「的封裝,就像ECMA5中對字段提供get/set訪問器同樣,固然這是個人一種猜想,解釋代碼以下:

 

從上圖中咱們看到,當我對name進行賦值的時候,其實改變的是args這個數組的值,同理當我改變arguments的值時,其實也是修改」內部數組「

的值,經過相似這種方法來達到咱們上層看到的同步機制,畫個簡圖以下:

 

2. length屬性

  若是你知道了上面的原理,那這個也好猜想,要麼取得是正真的「內部數組」的length,要麼就是取僞類arguments的length,反正最終都是

」內部數組」的length,對不對,比較經常使用可是又沒什麼好說的。

 

3.prototype屬性

   這個也是Function內部作出來的一個屬性,頗有意思,我想你們也有耳聞,也不是三言兩語能說得清楚的,準備放在下篇詳細的講講。

 

4.caller屬性

   看這個名字大概也知道個一二,就是用來獲取當前的父函數,不要小看這個caller哦,你有沒有想過它能夠實現C#中的stacktrace的功能

呢?有時候咱們記js日誌就靠這玩意了,好比下面這樣。

 

5:call,apply方法

 由於這兩個函數的功能都同樣,只不過call方法必須逐一參數賦值,而apply必須傳遞數組,若是想眼見爲實,能夠看看它們在vs裏面的代碼

提示,一切都明白了,因此我就放在一塊說了,不過這鳥東西有什麼好處呢?它最大的好處就是能夠隨便綁定對象,而後就能夠實現對綁定對象

動態新增方法和屬性,可能說的有點抽象,看個例子就OK啦。

 咱們發現,原本個人obj只是一個空對象,經過apply以後,個人obj對象具備name和age屬性了,是否是很神奇呢?

相關文章
相關標籤/搜索